2017-01-19 4 views
0

У меня проблема, и я надеюсь, что вы мне поможете.Django - не отображается правильно одна из моих таблиц в шаблоне

вот что у меня есть:

models.py

class Personinfo(models.Model): 
    name = models.CharField(max_length=128) 


    def __str__(self): 
     return self.name 

class Personage(models.Model): 
    AGES = (
    ('0', '0'), 
    ('1', '1'), 
    ('2', '2'), 
    ) 
    age = models.CharField(max_length=128,choices=AGES, default=True) 

    def __str__(self): 
     return self.age 

class Person(models.Model): 
    person = models.ForeignKey(Personinfo, null=True) 
    personage = models.ForeignKey(Personage, null=True) 
    address = models.TextField() 
    phone_number = models.CharField(max_length=128) 
    hobbies =models.CharField(max_length=128) 

    def __str__(self): 
     return self.address 

views.py

def index(request): 
    qs = Person.objects.all() 
    form = personform(request.POST or None) 
    form2 = personinfoform(request.POST or None) 
    form3 = personageform(request.POST or None) 
    context = { 
    "qs": qs, 
    "form2":form2, 
    "form":form, 
    "form3":form3, 
    } 
    form2_valid = form2.is_valid() 
    form_valid = form.is_valid() 
    form3_valid = form3.is_valid() 
    if form2_valid and form_valid and form3_valid: 
     a = form2.save() 
     b= form.save(commit=False) 
     b.person = a 
     b.save() 
     c = form3.save(commit=False) 
     c.personage = a 
     c.save() 
    return render(request, "index.html", context) 

forms.py

class personinfoform(forms.ModelForm): 
    name = forms.CharField(label= 'Nombre') 
    class Meta: 
     model = Personinfo 
     fields = ["name"] 


class personform(forms.ModelForm): 
    address = forms.CharField(label='Direccion') 
    phone_number = forms.CharField(label='Telefono') 
    hobbies = forms.CharField(label='Hobbies') 
    class Meta: 
     model = Person 
     exclude = ('person','personage',) 
     fields = ["address","phone_number","hobbies"] 

class personageform(forms.ModelForm): 
    class Meta: 
     model = Personage 
     fields =["age"] 

index.html

<form method="POST" action="">{% csrf_token %} 
{{form2.as_p}} 
{{form3.as_p}} 
{{form.as_p}} 
<input type="submit" value="Save!" /> 
</form> 

      <table > 
      <tr> 
       <th>Name</th> 
       <th>Age</th> 
       <th>Address</th> 
       <th>Telefono</th> 
       <th>Hobbies</th> 
      </tr> 
      {% for p in qs %} 
      <tr> 
       <td>{{ p.person.name}}</td> 
       <td>{{ p.personage.age }}</td> 
       <td>{{ p.address }}</td> 
       <td>{{ p.phone_number }}</td> 
       <td>{{ p.hobbies }}</td> 
      </tr> 
      {% endfor %} 
      </table> 

Как вы можете видеть, у меня есть 3 формы, и это правильно экономить, но это не показано в моем шаблоне как person.name, я пытаюсь personage.age Пытаюсь чтобы сделать его точно как Personinfo, но он не работает. Что не так?

В основном я хочу, чтобы Personage работал так, как Personinfo.

Спасибо ..!

+0

Вы проверить базу данных для 'Personinfo 'таблица для значения? Код выглядит отлично. –

ответ

1

Я не уверен, почему вы делаете свои модели такими сложными, что внешние ключи не очень полезны в этой ситуации, поэтому я предполагаю, что вы показываете нам упрощенную версию вашего кода.

Я думаю, что проблема в вашем коде сохранения. Порядок неправильный. Ваша основная модель должна быть сохранена последней, чтобы она включала внешние ключи. Вы должны сначала сохранить form2 и form3 и, наконец, сформировать. Я предлагаю вам использовать явные имена переменных вместо a, b, c, это сделает ошибку более очевидной. Также я думаю, что ваша персонажная форма не имеет места для возраста.

+0

Спасибо, ты был прав. – User100696

1

Порядок вашей экономии формы не является правильным, правильный порядок должен быть:

if form2_valid and form_valid and form3_valid: 
    age = form3.save() 
    info = form2.save() 
    person = form.save(commit=False) 
    person.personage = age 
    person.person = info 
    person.save() 

В шаблоне, вы должны использовать:

<td>{{ p.personage.get_age_display }}</td> 
+0

Вот и все! спасибо, сэр, хорошо объяснил! – User100696

Смежные вопросы