Django-选择字段未显示选项

时间:2018-07-23 11:23:04

标签: python html django forms select

model.py

from django.db import models
from django import forms
class CharApp(forms.Form):
    VAMPIRE = 'VP'
    DRAUGR = 'DR'
    BAELNORN = 'BN'
    LICH = 'LH'
    SHADOW = 'SW'
    RACE_CHOICES = (
        ('VP', 'Vampire'),
        ('DR', 'Draugr'),
        ('BN', 'Baelnorn'),
        ('LH', 'Lich'),
        ('SW', 'Shadow'),
    )
    app_id = models.AutoField(primary_key=True)
    char_name = models.CharField(max_length=80, verbose_name='Character Name')
    race = forms.Form(forms.ChoiceField( choices = RACE_CHOICES))
    date_applied = models.DateTimeField(verbose_name='Date Applied')
    background = models.TextField(verbose_name='Background')
    account_id = models.IntegerField(default=1, verbose_name='Account ID')
    submitted = models.BooleanField(default=False)

create.html

    <p><label for="race">Race:</label>
        <select name="{{ form.race.choices }}">
            {% for choices in form.race.choices %}
                {{ form.race.choices }}
            {% endfor %}
        </select>

出于某种原因,html的select部分根本不会循环,并且根本不显示任何值或文本。

2 个答案:

答案 0 :(得分:1)

为什么不使用内置django Select?

from django import forms
>>> CHOICES = (('1', 'First',), ('2', 'Second',))
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = ()
>>> choice_field.choices = (('1', 'First and only',),)
>>> choice_field.widget.choices
[('1', 'First and only')]

https://docs.djangoproject.com/en/2.0/ref/forms/widgets/#widgets-inheriting-from-the-select-widget

编辑:在查看代码时,您做的事情很奇怪……您可以在模型中定义Form,然后在表单中设置模型字段?我想你错位了概念

models.py

from django.db import models

# THIS IS YOUR MODEL, WILL BE PERSISTED IN YOUR DATABASE
class Race(models.Model):
    ... # Here you will place fields related to the race, as name, date and etc...


class CharApp(models.Model):
    VAMPIRE = 'VP'
    DRAUGR = 'DR'
    BAELNORN = 'BN'
    LICH = 'LH'
    SHADOW = 'SW'
    RACE_CHOICES = (
        ('VP', 'Vampire'),
        ('DR', 'Draugr'),
        ('BN', 'Baelnorn'),
        ('LH', 'Lich'),
        ('SW', 'Shadow'),
    )

    app_id = models.AutoField(primary_key=True)
    char_name = models.CharField(max_length=80, verbose_name='Character Name')
    race = models.ForenignKey(Race, related_name="charapp_race")
    date_applied = models.DateTimeField(verbose_name='Date Applied')
    background = models.TextField(verbose_name='Background')
    account_id = models.IntegerField(default=1, verbose_name='Account ID')
    submitted = models.BooleanField(default=False)

forms.py #在您的应用文件夹中创建此文件

from django.forms import ModelForm
from myapp.models import Article

from .models import CharApp, RACE_CHOICES

# this is your form
class CharAppForm(ModelForm):
    # Here you can change the widget or add new fields that is not related your model form
    race = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES) #if you want to change the default form widget to this field

    class Meta:
        model = CharApp
        fields = ['__all__'] # This will get all fields from your form, or just place each field you want to display

记住要在view.py上创建表单实例

from .models import CharApp
from .forms import CharAppForm

# The function that will render your html or give you responses from your backend to your frontend

def your_view(request): 
    form = ConfigAppForm() # This will render your form with no value (so when pages render)
    if request.method == "POST:
        form = ConfigAppForm(request.POST) # This will bring the data that user have filled at your html and sended to your backend
        if form.is_valid(): # Check if the form is valid and able to save
            form.save() # will save the instance of your ConfigApp at your database

您可以在html中致电

<!-- This will render your entire form -->
{{ form.as_p}}
<!-- Obs: If you need to add css class or something like it you can override the widget at your form.py and add this classes thought attr of your field -->

以下一些指南可帮助您理解MVC(或Django的MTV)的概念

MVC:https://softwareengineering.stackexchange.com/questions/127624/what-is-mvc-really

MTV Django:https://docs.djangoproject.com/en/2.0/faq/general/

Django视图:https://docs.djangoproject.com/en/2.0/topics/http/views/

Django模型:https://docs.djangoproject.com/en/2.0/topics/db/models/

Django模型表格:https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/

编辑

如果您想不执行我之前说的任何事情就能使代码工作

VAMPIRE = 'VP'
DRAUGR = 'DR'
BAELNORN = 'BN'
LICH = 'LH'
SHADOW = 'SW'
RACE_CHOICES = (
    ('VP', 'Vampire'),
    ('DR', 'Draugr'),
    ('BN', 'Baelnorn'),
    ('LH', 'Lich'),
    ('SW', 'Shadow'),

class CharApp(forms.Form):
    ...
    race = forms.Form(forms.ChoiceField( choices = RACE_CHOICES))

答案 1 :(得分:0)

您必须在表单中将竞赛字段取消为CharField而不是Form。看这个

race = forms.ChoiceField(choices = RACE_CHOICES, widget=forms.Select())

然后在您的模板中打印如下选项

{% for key, value in form.race.choices %}
    <option value="{{ key }}">{{ value }}</option>
{% endfor %}