2016-04-04 15 views
1

models.py:Hata başka formun oluşturulmasını çağrılırken

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 bu kod çalışmaz.

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

Kesinlikle yanlış burada bir şey yaptım, ama ben tam olarak ne bilmiyorum: dolayı bu hataları LocationForm kaydetmez. Forms.py'deki kodu, özellikle de RegistrationForm için kaydetme yöntemini karıştırdığımı itiraf ediyorum çünkü başka bir formun nasıl oluşturulduğunu ve bunların ikisi arasında nasıl bir bağlantı kuracağımı bilmiyorum. İnternette aradım ama bu konuda kesin bilgi bulamadım, bu yüzden doğaçlamaya çalıştım ama ne yazık ki başarısız oldum. Birisi bana yardım edebilir mi? Şimdiden teşekkürler!


GÜNCELLEME: views.py (şu anda):

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}) 

Ben de forms.py modifiye ettik ama hala yukarıdan hata var.

cevap

1

RegistrationForm'un içinde LocationForm'u kullanmak yerine, views.py numaranızda bunları ayrı ayrı işleyebilir, daha temiz bir kodla sonuçlanır ve kullanımı kolaydır.

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}) 

Burada daha django docs birden fazla iç içe formları işlemek için nasıl okuyabilir.

+0

Öyleyse koddaki "else" kısmını buraya nasıl uyarlarım: http://pastebin.com/raw/qHRxcApG – MikiSoft

+0

@MikiSoft sorunuzu güncelleyin veya kodu yorumda paylaşın, herhangi bir bağlantı paylaşmayın; onun tavsiye edilmez. – anand

+0

Yeni bir satır olmadığında kodu bu yanıtta nasıl gönderebilirim? Bu yüzden onu Pastebin'de paylaştım, sizden açmamak saçma. – MikiSoft

İlgili konular