2017-08-08 72 views
0

蟒蛇= 2.7,則Django = 13年1月11日如何在下拉列表(django)中顯示對象?

在我的HTML,我無法從我的models.py 顯示我的病情選擇時填寫表格,用戶無法選擇的條件,因爲他們是沒有顯示。

models.py

class Books(models.Model): 
    book_name = models.CharField(max_length=100) 
    book_condition = models.ForeignKey('Condition') 

    def __unicode__(self): 
     return self.book_name 


class Condition(models.Model): 
    NEW = 'new' 
    USED = 'used' 
    COLLECTIBLE = 'collectible' 
    CONDITION_CHOICES = (
     (NEW, 'New'), 
     (USED, 'Used'), 
     (COLLECTIBLE, 'collectible'), 
    ) 
    book = models.ForeignKey(Books) 
    condition = models.CharField(max_length=10, choices=CONDITION_CHOICES) 

    def __unicode__(self): 
     return self.condition 

views.py

def add_book(request): 
    if request.method == 'GET': 
     context = { 
      'form': BookForm() 
     } 

    if request.method == 'POST': 
     form = BookForm(request.POST) 
     if form.is_valid(): 
      form.save() 
     context = { 
      'form': form, 
     } 

    return render(request, 'add_book_form.html', context=context) 

add_book_form.html

{% extends 'base.html' %} 
{% block body %} 

<h3>Add Book </h3> 
<form action="" method="post"> 
    {% csrf_token %} 
    {{ form}} 

    <br/> 
    <input class="button" type="submit" value="Submit"/> 
</form> 

{% endblock %} 

這是我的形式,我不確定我缺少什麼。

形式

from django.forms import ModelForm 
from .models import Books, Condition 


class BookForm(ModelForm): 
    class Meta: 
     model = Books 
     fields = '__all__' 


class ConditionForm(ModelForm): 
    class Meta: 
     model = Condition 
     fields = '__all__' 
+0

你可以顯示「窗體」? – zaidfazil

+0

當然!我只是添加了代碼,謝謝! – superrtramp

回答

0

你傳遞給視圖的形式是BookForm,該BookForm包含一個ForeignKey場條件的模式,所以在選擇的選項將是條件模型的實例。

您需要通過管理界面或shell搶先創建Condition模型實例,然後才能看到select上的條件,但這無濟於事,因爲您的Condition實例需要關聯到一本書,這讓我覺得你的軟件設計不好。

讓我提出一個解決方案:

class Book(models.Model): 
    """ 
    This model stores the book name and the condition in the same 
    table, no need to create a new table for this data. 
    """ 
    NEW = 0 
    USED = 1 
    COLLECTIBLE = 2 
    CONDITION_CHOICES = (
     (NEW, 'New'), 
     (USED, 'Used'), 
     (COLLECTIBLE, 'Collectible'), 
    ) 
    name = models.CharField(max_length=100) 
    condition = models.SmallIntegerField(choices=CONDITION_CHOICES) 

    def __unicode__(self): 
     return "{0} ({1})".format(self.book_name, self.condition) 

class BookForm(ModelForm): 
    class Meta: 
     model = Book 
     fields = '__all__' 

現在的條件保存爲一個整數(如這將是,如果你使用外鍵),你的軟件更容易理解和發展。

+0

它的工作原理!天才解決方案,謝謝! – superrtramp

+0

我很高興你喜歡它。這是常見的禮節來標記解決方案與綠色票證標誌一起工作:-)不用客氣。 – fixmycode

0

嘗試使用Django widgets。例如:

class BookForm(forms.Form): 
categories = (('Adventure', 'Action'), 
       ('Terror', 'Thriller'), 
       ('Business', 'War'),) 
description = forms.CharField(max_length=9) 
category = forms.ChoiceField(required=False, 
          widget=forms.Select, 
          choices=categories) 
相關問題