在django admin中,我们可以根据选择进行多项选择

时间:2009-11-10 21:37:17

标签: django django-admin

http://docs.djangoproject.com/en/dev/ref/models/fields/#choices

我已经阅读了文档,这意味着使用数据库表来获取动态数据,但它说明了

  

选择适用于静态数据,如果有的话,变化不大。

那么如果我想使用选项,但是选择多个,因为我使用的数据非常静态,例如一周中的几天。

无论如何都没有数据库表来实现这个目标吗?

3 个答案:

答案 0 :(得分:5)

ChoiceField并不适合多种选择,而是使用ManyToManyField。忽略现在可以使用Choices而不是ForeignKey来获取静态数据的事实。如果结果是一个性能问题,有一些方法可以用不同的方式表示(一种是二元掩码方法),但它们需要更多的工作。

答案 1 :(得分:4)

这对我有用:

1)创建一个Form类并设置一个属性,以便为MultipleChoiceField提供静态选择

from django import forms
from myapp.models import MyModel, MYCHOICES

class MyForm(forms.ModelForm):
    myfield = forms.MultipleChoiceField(choices=MYCHOICES, widget=forms.SelectMultiple)
    class Meta:
        model = MyModel

2)然后,如果您正在使用管理界面,请在您的管理类中设置表单属性,以便山雀将使用您的自定义表单

from myapp.models import MyModel
from myapp.forms import MyForm
from django.contrib import admin

class MyAdmin(admin.ModelAdmin):
    form = MyForm

admin.site.register(MyModel, MyAdmin)

答案 2 :(得分:1)

尝试以下配置。在models.py

class MyModel(models.Model):
    my_choices = models.TextField(help_text="It's a good manners to write it")
forms.py

中的

CHOICES = ((1,1), (2,2))
class MyForm(forms.ModelForm):
    my_choices = forms.MultipleChoiceField(choices=CHOICES)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # maybe you can set initial with self.fields['my_choices'].initial = initial 
        # but it doesn't work wity dynamic choices
        obj = kwargs.get('instance')
        if obj:
            initial = [i for i in obj.my_choices.split(',')]
            self.initial['my_choices'] = initial

    def clean_lead_fields(self):
        return ','.join(self.cleaned_data.get('my_choices', []))
admin.py

中的

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm