【问题标题】:Django, how to set value in forms.ModelFormDjango,如何在 forms.ModelForm 中设置值
【发布时间】:2020-05-15 10:19:02
【问题描述】:

我有一个问题要问你。我有以下型号:

class Centro_di_costo(models.Model):
    centro_di_costo = models.CharField('Centro di costo', max_length=30)

    def __str__(self):
        return   self.centro_di_costo

class AltriCosti(models.Model):
    STATUS_CHOICES= [
        ('VARIABILE', 'VARIABILE'),
        ('FISSO', 'FISSO'),
    ]
    centro_di_costo = models.ForeignKey(Centro_di_costo) 
    sub_centro_di_costo = models.CharField('Categoria', max_length=30)
    status = models.CharField(choices=STATUS_CHOICES)
    price=models.DecimalField()
    quantity=models.IntegerField()

我在很多视图中都使用它,但在其中一个视图中,我想设置值而不从 POST 请求传递。 所以我尝试通过以下方式设置ModelForm:

class ModCollaboratori(forms.ModelForm):
    class Meta:
        model = AltriCosti
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(ModCollaboratori, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = False
        self.fields['centro_di_costo'].value= "Servizi di Produzione"
        self.fields['sub_centro_di_costo'].value = "Collaboratori esterni"
        self.fields['status'].value = "VARIABILE"

但它不起作用。如何修复代码以使其正常工作?

【问题讨论】:

  • 如果不使用request.POST,可以简单的构造一个模型对象。
  • 以哪种方式?这些模型还有其他我没有得到答案的领域。我总共有 5 个字段,其中三个(centro_di_costo、sub_centro_di_costo 和 status)我想在不从请求中传递的情况下输入一个值
  • 然后你从你的模型字段中排除这些,并通过视图“注入”这些。

标签: django django-models django-forms django-views django-templates


【解决方案1】:

您可以从表单中排除字段:

class ModCollaboratori(forms.ModelForm):
    class Meta:
        model = AltriCosti
        exclude = ['centro_di_costo', 'sub_centro_di_costo', 'status']

然后在您看来,您可以为这些字段“注入”值:

def some_view(request):
    if request.method == 'POST':
        form = ModCollaboratori(request.POST, request.FILES)
        if form.is_valid():
            form.instance.sub_centro_di_costo = 'Collaboratori esterni'
            form.instance.status = 'VARIABILE'
            form.instance.centro_di_costo = Centro_di_costo.objects.get_or_create(
                centro_di_costo='Servizi di Produzione'
            )[0]
            form.save()
            return redirect('name-of-some-view')
    else:
        form = ModCollaboratori()
    return render(request, 'some_template.html', {'form': form})

【讨论】:

  • 我了解您的解决方案,但我的模型中有其他两个变量通过 ModCollaboratori 表单获得。
  • 好的,但我不明白我必须在哪里添加初始参数。以我的形式?
  • @Jfix91:你不排除这些(这样用户不会覆盖这些),然后在视图中指定这些,请参阅编辑。
  • 感谢作品,唯一的问题是关于form.instance.centro_di_costo_id = … (primary key)。 Django 给我FOREIGN KEY constraint failed.
  • @Jfix91:你需要指定你链接到的对象的主键。这可以不是是字符串,因为ForeignKey 保存了对象的主键。
【解决方案2】:

为您的代码

self.fields['status'].value = "VARIABLE"

使其工作更改为

self.instance.status = "VARIABLE"

结果:

状态:变量

【讨论】:

    猜你喜欢
    • 2022-08-13
    • 2015-07-17
    • 2021-05-23
    • 2021-01-10
    • 2023-01-19
    • 2011-08-02
    • 2015-02-05
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多