gpt4 book ai didi

django - 在处理之前更改 Django 表单数据

转载 作者:行者123 更新时间:2023-12-04 19:20:44 25 4
gpt4 key购买 nike

我有一个模型的表单,它有两个字段:field_A 和 field_B。我想要:

  • 呈现表单时:仅显示 field_A
  • 当我调用 form.save() field_B 保存在模型中,其值来自 field_A

  • 我试过的:
    field_A = forms.CharField(required=True)
    field_B = forms.CharField(required=False)

    def save(self, *args, **kwargs):
    """
    Overriding save, so call the parent form save and return the new_user
    object.
    """
    self.data["field_B"] = self.data["field_A"]
    self.cleaned_data["username"] = self.cleaned_data["email"]
    super(MyParentClass*, self).save(*args, **kwargs)
    *这两个字段都是从 ParentClass 继承的,它们是必需的

    最佳答案

    这是一个对我有用的解决方案。

    # models.py
    class MyModel(models.Model):
    field_A = models.CharField(max_length = 255)
    field_B = models.CharField(max_length = 255)

    def __unicode__(self):
    return "%s: %s, %s" % (self.pk, self.field_A, self.field_B)

    # forms.py
    class MyModelForm(ModelForm):
    class Meta:
    model = MyModel
    exclude = ('field_B',)

    def save(self, *args, **kwargs):
    commit = kwargs.pop('commit', True)
    instance = super(MyModelForm, self).save(*args, commit = False, **kwargs)
    instance.field_B = self.cleaned_data['field_A']
    if commit:
    instance.save()
    return instance

    表格的解释Meta
    exclude = ('field_B',)

    确保满足您的第一个条件。当表单只显示给用户时 field_A被陈列。第二个条件在被覆盖的 save() 中得到解决。方法。

    save()的解释
    commit = kwargs.pop('commit', True)

    提取 commit关键字参数(如果提供)。
    instance = super(MyModelForm, self).save(*args, commit = False, **kwargs)

    创建基础模型的实例。明确传递 commit=False以确保此实例尚未保存到数据库中。
    instance.field_B = self.cleaned_data['field_A']

    赋值 field_A来自 cleaned_data到实例的 field_B .请记住,您应该调用 form.is_valid()在这之前。否则不会有 cleaned_data .
            if commit:
    instance.save()

    如果用户希望将实例保存到数据库中,请执行此操作。
    return instance

    最后,返回实例。

    示例使用
    In [1]: from app.forms import MyModelForm

    In [2]: f = MyModelForm(data = {'field_A': 'Value A'})

    In [3]: f.is_valid()
    Out[3]: True

    In [4]: f.save()
    Out[4]: <MyModel: 3: Value A, Value A>

    In [5]: f = MyModelForm(data = {'field_A': 'VA'})

    In [6]: f.is_valid()
    Out[6]: True

    In [7]: f.save(commit = False)
    Out[7]: <MyModel: None: VA, VA>

    In [8]:

    关于django - 在处理之前更改 Django 表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3818385/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com