python django表单中不显示复选标记

a9wyjsp7  于 2023-05-05  发布在  Python
关注(0)|答案(2)|浏览(115)

我创建了联系表格,但复选标记不显示该选项,框非常窄。所以当以管理员身份登录并尝试添加联系人时,我在那里看不到选项。这里是models.py和forms.py和截图。

models.py

class Location(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name
    
class Contact(models.Model):

    
    LOCATION_INHOME = (
        ('kitchen', 'Kitchen'),
        ('bathroom', 'Bathroom'),
        ('bedroom', 'Bedroom'),
        ('livingroom', 'Living Room'),
        ('basement', 'Basement'),
        ('garage', 'Garage'),
        ('office', 'Office'),
        ('hallway', 'Hallway'),
        ('stairway', 'Stairway'),
        ('recreationroom', 'Recreation Room'),
        ('closet', 'Closet'),
        ('other', 'Other'),
    )

    
    location_in_home = models.ManyToManyField(Location)
    

    
class ContactForm(ModelForm):
    
    model = Contact
    fields = '__all__'
        
    class Meta:
        model = Contact
        fields = '__all__'

forms.py

from django import forms
from django.forms import ModelForm
from .models import Contact

class ContactForm(forms.ModelForm):
    
    class Meta:
        model = Contact
        fields = [

            'location_in_home',

        ]
        
        widgets = {
            'location_in_home': forms.CheckboxSelectMultiple(),
        }

这里是admin.py

class ContactAdmin(admin.ModelAdmin):

    list_filter = ('location_in_home')

admin.site.register(Contact, ContactAdmin)
31moq8wy

31moq8wy1#

选择框为空,因为Location模型中没有值。多对多模型适用于动态创建可通过M2M关系链接的示例的情况,而不是像在LOCATION_INHOME中创建的静态选择。如果你想有一个选择多个表单域与静态选项,你需要使用第三方软件包,如https://pypi.org/project/django-select-multiple-field/。如果您想使用M2M关系的动态选择,您需要首先在Location模型中填充这些选项。

iugsix8n

iugsix8n2#

需要将表单附加到ModelAdmin的**.form**属性[Django-doc]上:

from django.contrib import admin

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    form = ContactForm
    list_filter = ('location_in_home', )

当然,如果至少有一个位置已经构建,它将只呈现选项。
否则你只是构造了一个形式。但是你可以为同一个模型创建零个、一个或多个ModelForm,除非你在视图、管理等中使用它们,否则它们不会做任何事情。

相关问题