如何在表格中传递视图中的选项.ChoiceField



我想制作一个用于在线测试的表格,但我不知道如何制作单选按钮(forms.ChoiceField或类似按钮(,并不是从表格而是从视图传递选择值。为什么你不能直接从模型中得到表格?因为我事先不知道需要哪个pk。

请告诉我一个选项,它将帮助您创建一个在线测试表格。我用例子提问,这样更容易理解。提前谢谢。

class Course(models.Model):
title = models.CharField(max_length=255, verbose_name='***')
slug = models.SlugField(max_length=255, verbose_name='url', unique=True)
metadesc = models.CharField(max_length=255, verbose_name='Meta description', default='***')
content = models.TextField(blank=True, verbose_name='****')
colLec = models.IntegerField(max_length=255, default=0, verbose_name='***')
Lect1 = models.TextField(blank=True, verbose_name='****')
Lect2 = models.TextField(blank=True, verbose_name='****')
Lect3 = models.TextField(blank=True, verbose_name='***')
Test1 = models.TextField(blank=True, verbose_name='***')
Test1_1 = models.TextField(blank=True, verbose_name='***')
Test1_2 = models.TextField(blank=True, verbose_name='***')
Test1_3 = models.TextField(blank=True, verbose_name='****')
Test1_4 = models.TextField(blank=True, verbose_name='***')
Test1_5 = models.TextField(blank=True, verbose_name='***')
def __str__(self):
return self.title
class Meta:
verbose_name = '***'
verbose_name_plural = '****'
ordering = ['title']

https://docs.djangoproject.com/en/3.2/howto/custom-model-fields/#specifying-模型场

https://docs.djangoproject.com/en/3.2/ref/forms/widgets/

通过在模型中这样做,你会做一些这样的事情
型号.py

class Thing(models.Model):
NAMES=  [
('foo', 'Foo'),
('bar', 'Bar')
] # choices can be defined elsewhere
name = models.CharField(max_length=100, null=True, blank=True,choices=NAMES)

在同一个应用程序中,使表单
forms.py

from .models import Thing
class Thingform(forms.ModelForm):
NAMES=  [
('foo', 'Foo'),
('bar', 'Bar')
] # choices still need to be defined here, since we are overriden a wiget, so it would be best to define choices in one location
name = forms.ChoiceField(widget=forms.RadioSelect, choices=NAMES)
class Meta:
model = Thing 
fields = '__all__'
name.widget.attrs.update({'class':'foo'}) # adding class to the <ul> widget

然后在视图中呈现表单


from .forms import Thingform
def your_view(reqwuest)
...
form = Thingform()
return render(request, 'form.html', {'form':form})

不要忘记你的css删除丑陋的要点

.foo {
list-style:none;
}

==============================================
现在你可以用一种快速而肮脏的方式来完成,我不建议这样做,这是代码可读性的主要原因之一。根据文档,理论上可以在views中完成所有操作。如下所示。。
Views.py

from django.shortcuts import render 
from django import forms

def index(request):
CHOICES = [
('new_foo', 'New Foo'),
('new_bar', 'new bar')]
choice_field = forms.ChoiceField(widget=forms.RadioSelect(attrs={'class':'foo'}), choices=CHOICES) # dont forget styling
class InViewForm(forms.Form): pass #most simplest form
form = InViewForm()
form.fields['name'] = choice_field # access form fields attr
return render(request, 'form.html', {'form':form})

最新更新