2016-11-06 4 views
-1

マイモデルフォーム:更新フォームは、カスタムクリーンな方法を使用した後は動作しませ

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』オブジェクトが 『要求』は属性を持っていない」私が使用している場合

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

はそれはのように私のカスタム検証エラーを発生させますCreateForm。同じ人物がすでにデータベースに入っているからです。誰でも私の方法を示唆して、Updateformを修正して既存のデータを正しく更新する方法を提案することができます。

+0

感謝。 self.instance.id:私のきれいな方法でブロックする場合、私はそれを使用して解決しました。私はすぐに作業コードを投稿します。 –

答えて

0

作業コードは次のとおりです。

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 
関連する問題