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部分根本不会循环,并且根本不显示任何值或文本。
答案 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 %}