Django形成额外的空单选按钮

时间:2015-08-04 13:49:57

标签: python html django

在渲染模型表单时会产生一个额外的单选按钮,我不知道它来自哪里:

>>> 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']

5 个答案:

答案 0 :(得分:0)

Django必须有一种方法允许为可空字段(带有required=False的字段)设置None值,并通过附加一个空值的选项来实现。 Select元素也会发生同样的事情。

现在,为了让Django将该选项添加到您的表单中,document_type字段必须可以为空(确实有required=False),而我只能假设您在表单的定义中的某个位置&#39 ;重新设置该字段的选项。

PS:如果为模型自动生成表单(即您使用Django&#39; s ModelForm),那么模型应该将字段设置为blank=True, null=True,但是显然不见了。不过,ModelForm会晃动,所以如果你不熟悉它,那就试试吧。

UPDATE:

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)