2016-04-04 11 views
1

models.py:エラー別のフォームの作成を呼び出すとき

from django.db import models 
from django.contrib.auth.models import User as BaseUser 

CHOICE_GENDER = ((1, 'Male'), (2, 'Female')) 


class Location(models.Model): 
    city = models.CharField(max_length=75) 
    country = models.CharField(max_length=25) 

    def __unicode__(self): 
     return ', '.join([self.city, self.state]) 


class Users(BaseUser): 
    user = models.OneToOneField(BaseUser, on_delete=models.CASCADE) 
    gender = models.IntegerField(choices=CHOICE_GENDER) 
    birth = models.DateField() 
    location = models.ForeignKey(Location) 

    class Meta: 
     ordering = ('user',) 

forms.py:

from django.contrib.auth.forms import UserCreationForm 
from django import forms 
from .models import Users, Location, CHOICE_GENDER 


class LocationForm(forms.ModelForm): 
    city = forms.CharField(max_length=75) 
    country = forms.CharField(max_length=25) 

    class Meta: 
     model = Location 
     fields = ('city', 'country',) 


class RegistrationForm(UserCreationForm): 
    email = forms.CharField(max_length=75) 
    first_name = forms.CharField(max_length=30) 
    last_name = forms.CharField(max_length=30) 
    gender = forms.ChoiceField(choices=CHOICE_GENDER) 
    birth = forms.DateField() 
    location = LocationForm() 

    class Meta: 
     model = Users 
     fields = ('username', 'email', 'first_name', 'last_name', 'gender', 'birth') 

    def save(self, commit=True): 
     user = super(RegistrationForm, self).save(commit=False) 
     user.email = self.cleaned_data['email'] 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.gender = self.cleaned_data['gender'] 
     user.birth = self.cleaned_data['birth'] 
     if commit: 
      user.save() 
     return user 

forms.pyでこのコードは動作しません。これらのエラーのため、LocationFormは保存されません。

country - This field is required. 
city - This field is required.

ここでは間違いがありましたが、どういうことがわかりません。私はform.pyのコードを混乱させてしまったことは認めています。特に、別のフォームの作成を正しく呼び出す方法と、2つのフォーム間の接続を行う方法がわからないため、RegistrationFormのsaveメソッドで特にそうです。私はインターネットを検索しましたが、正確な情報は見つかりませんでしたので、即興化しようとしましたが、残念ながら失敗しました。 誰かが私にこれを手伝ってもらえますか?前もって感謝します!


UPDATE:views.py(現在):

def signup(request): 
    if request.method == "POST": 
     reg_form = RegistrationForm(request.POST) 
     loc_form = LocationForm(request.POST) 
     if reg_form.is_valid() and loc_form.is_valid(): 
      location = loc_form.save() 
      reg_form.cleaned_data['location_id'] = location.id 
      registration = reg_form.save() 
     else: 
      pass 
    else: 
     reg_form = RegistrationForm() 
     loc_form = LocationForm()  
    return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form':reg_form}) 

私もforms.pyを変更したが、私はまだ上からエラーを得ました。

答えて

1

LocationFormRegistrationFormの内部で使用する代わりに、あなたはviews.pyでセレクトして処理することができます。これにより、コードがより洗練され、扱いやすくなります。

if request.method == "POST": 
    reg_form = RegistrationForm(request.POST) 
    loc_form = LocationForm(request.POST) 
    if reg_form.is_valid() and loc_form.is_valid(): 
     # since in your case they are dependent on each other 
     # save location form and get location object 
     location = loc_form.save() 
     # now you can use it in your reg_form 
     reg_form.cleaned_data['location_id'] = location.id 
     registration = reg_form.save() 
    else: 
     # no need to handle this case only for explanation 
     # use the forms, with valid post data initialized 
     # at the start of current if block 
     pass 
else: 
    # create new forms for location and registration 
    reg_form = RegistrationForm() 
    loc_form = LocationForm()  
return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form':reg_form}) 

あなたはここよりdjango docsで複数のネストされたフォームを処理する方法について読むことができます。

+0

ここでコード内の "else"部分をどのように変更すればいいですか?http://pastebin.com/raw/qHRxcApG – MikiSoft

+0

@MikiSoftは親切に質問を更新したり、コメント内のコードを共有したり、リンクを共有したりしません。それは知らされていません。 – anand

+0

新しい返信がない場合、この返信にコードを投稿するにはどうすればよいですか?そういうわけで私はペーストビンでそれを共有しました。あなたがそれを開けないのは不合理です。 – MikiSoft

関連する問題