【问题标题】:Update form not work after using custom clean method使用自定义清理方法后更新表单不起作用
【发布时间】:2017-03-19 17:21:02
【问题描述】:

我的模型形式:

class MemberForm(ModelForm):
    birth_date = forms.DateField(widget=forms.widgets.DateInput(format="%m/%d/%Y"))
    class Meta:
        model = Person
        exclude =('user',)

    def clean(self):
        user = get_user(self.request)
        name = self.cleaned_data.get('name')
        birth_date = self.cleaned_data.get('birth_date')
        if Person.objects.filter(user=user).exists():
            self.add_error('name', "You already submitted data")
        elif Person.objects.filter(name=name, birth_date=birth_date).exists():
            self.add_error('name', "Person with this Name and Birth date already exists.")
        return self.cleaned_data

    def save(self, commit=True):
        person = super().save(commit=False)
        if not person.pk:
            person.user = get_user(self.request)
        if commit:
            person.save()
            self.save_m2m()
        return person

我的观点:

class PersonCreate(CreateView):
    template_name = 'member/person_form.html'
    model = Person
    success_url = '/person/'
    form_class = MemberForm

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.request = self.request
        return form


class PersonUpdate(UpdateView):
    template_name = 'member/person_form.html'
    model = Person
    success_url = '/person/'
    form_class = MemberForm

当我创建一个人时,我的 MemberForm 工作正常。当用户不是唯一的并且用户名和出生日期组合不是唯一的时,它还会在表单中给出验证错误。但是当我尝试更新保存的表单时,它会出错并说:“'MemberForm' 对象没有属性'request'”

如果我使用

 def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.request = self.request
        return form

在 UpdateView 中,它会引发我的自定义验证错误,例如 CreateForm。由于同一个人已经在数据库中。谁能建议我如何修复 Updateform 以便正确更新我现有的数据。

【问题讨论】:

  • 感谢您的回复。我在我的 clean 方法中使用 if self.instance.id: block 解决了它。我很快就会发布我的工作代码。

标签: django forms view


【解决方案1】:

工作代码是:

def clean(self):
    user = get_user(self.request)
    name = self.cleaned_data.get('name')
    birth_date = self.cleaned_data.get('birth_date')
    if self.instance.id:
        if Person.objects.filter(user=user).exclude(id=self.instance.id).exists():
            self.add_error('name', "You already submitted data")
        elif Person.objects.filter(name=name, birth_date=birth_date).exclude(id=self.instance.id).exists():
            self.add_error('name', "Person with this Name and Birth date already exists.")
    else:
        if Person.objects.filter(user=user).exists():
            self.add_error('name', "You already submitted data")
        elif Person.objects.filter(name=name, birth_date=birth_date).exists():
            self.add_error('name', "Person with this Name and Birth date already exists.")
    return self.cleaned_data

在视图中:

class PersonUpdate(UpdateView):
    template_name = 'member/person_form.html'
    model = Person
    success_url = '/person/'
    form_class = MemberForm

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.request = self.request
        return form

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2020-12-10
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多