在渲染模型表单时会产生一个额外的单选按钮,我不知道它来自哪里:
>>> f = DocumentForm()
>>> print f['document_type']
<ul id="id_document_type">
<li><label for="id_document_type_0"><input checked="checked" id="id_document_type_0" name="document_type" type="radio" value="" /> ---------</label></li>
<li><label for="id_document_type_1"><input id="id_document_type_1" name="document_type" type="radio" value="1" /> Campus LAN</label></li>
<li><label for="id_document_type_2"><input id="id_document_type_2" name="document_type" type="radio" value="2" /> WAN</label></li>
<li><label for="id_document_type_3"><input id="id_document_type_3" name="document_type" type="radio" value="3" /> UC</label></li>
</ul>
第一个带有value=""
的单选按钮和---------
的文字,我已经搜查了我的代码,无法解决它的来源?
models.py
class DocumentType(models.Model):
name = models.CharField("Document Type", max_length=240)
class Document(models.Model):
document_type = models.ForeignKey(DocumentType,
verbose_name="Document Type")
>>> DocumentType.objects.all()
[<DocumentType: Campus LAN>, <DocumentType: WAN>, <DocumentType: UC>]
>>> d = Document.objects.all()
>>> for x in d:
... print x.document_type
...
Campus LAN
Campus LAN
模板:
<form role="form" action="" method="POST">{% csrf_token %}
{{ form.as_p}}
<input type="submit" value="Save" />
</form>
forms.py:
class DocumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(DocumentForm, self).__init__(*args, **kwargs)
self.fields['sections'].queryset = Section.objects.filter(associated_document="Original Section")
self.fields['document_type'].queryset = DocumentType.objects.all()
class Meta:
model = Document
fields = ('customer', 'title', 'document_type', 'sections',)
widgets = {
'sections': forms.widgets.CheckboxSelectMultiple,
'document_type': forms.widgets.RadioSelect,
}
views.py
def new_lld(request):
if request.method == "POST":
form = DocumentForm(request.POST)
if form.is_valid():
document = form.save(commit=False)
document.author = request.user
document.save()
form.save_m2m()
return redirect('lld:index')
else:
form = DocumentForm()
return render(request, 'lld/new_lld.html', {'form': form})
admin.py
class DocumentAdmin(admin.ModelAdmin):
fieldsets = [
('Document Info', {'fields': ['author', 'customer', 'title',
'slug']}),
('Document Type', {'fields': ['document_type', 'sections']}),
]
inlines = [VersionInline]
prepopulated_fields = {"slug": ("customer", "title",)}
list_display = ('title', 'customer', 'author', 'document_type',
'date_created', 'date_updated')
list_filter = ['date_updated', 'author']
答案 0 :(得分:0)
Django必须有一种方法允许为可空字段(带有required=False
的字段)设置None值,并通过附加一个空值的选项来实现。 Select元素也会发生同样的事情。
现在,为了让Django将该选项添加到您的表单中,document_type
字段必须可以为空(确实有required=False
),而我只能假设您在表单的定义中的某个位置&#39 ;重新设置该字段的选项。
PS:如果为模型自动生成表单(即您使用Django&#39; s ModelForm),那么模型应该将字段设置为blank=True, null=True
,但是显然不见了。不过,ModelForm会晃动,所以如果你不熟悉它,那就试试吧。
TBH我无法解决为什么可以为空的问题,但请尝试在表单中手动设置required=True
,方法与@Alistair指定的方式相同。
self.fields['document_type'].required = True
在您修改该字段以设置查询集的行的正下方。我认为这应该有效。
答案 1 :(得分:0)
解决方法是用css隐藏它:
#id_document_type li:first-child {display:none}
答案 2 :(得分:0)
正如奥古斯丁所说,ModelChoiceFields must be set to required in order to remove the blank choice。
def __init__(self, queryset, empty_label="---------",
required=True, widget=None, label=None, initial=None,
help_text='', to_field_name=None, limit_choices_to=None,
*args, **kwargs):
if required and (initial is not None):
self.empty_label = None
else:
self.empty_label = empty_label
默认情况下,必需设置为False,因此您需要将以下内容添加到文档表单中的 init
self.fields['document_type'].required=True
答案 3 :(得分:0)
我们走了:
https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ModelChoiceField.empty_label
从这里开始:
Django CheckboxSelectMultiple widget adds --------- value to query set
因此:
$('#myField').val($('#myField').prop("defaultValue"));
诀窍。
答案 4 :(得分:0)
我通过在模型中的字段声明中添加以下参数来解决此问题:
blank=False, default=None
因此,在这种情况下,您的模型将如下所示:
document_type = models.ForeignKey(DocumentType,
verbose_name="Document Type", blank=False, default=None)