为什么你不使用内置的 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
编辑:当我查看您的代码时,您做了一些非常奇怪的事情......您可以在您的模型中定义您的表单并在您的表单中设置模型字段?我猜你放错了概念
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))