Django Select字段不显示选项

2024-05-17 18:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在模型.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)

在创建.html在

^{pr2}$

由于某些原因,html的select部分根本不循环,并且根本不显示值或文本。在


Tags: djangonamefromimportformverbosemodelsforms
2条回答

你必须在形式上清除种族领域,因为查尔菲尔德不是形式。看这个

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

然后在你的模板打印选项像这样

^{pr2}$

为什么不使用内置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

编辑:当我看着你的代码时,你做了一件很奇怪的事情。。。您可以在模型中定义表单,并在表单中设置模型字段?我猜你把概念放错了

模型.py

^{pr2}$

表单.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

请记住,在视图.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))

相关问题 更多 >