2011-02-24 47 views
11

我需要制作一个表单,其中有1个选择和1个文本输入。选择必须从数据库中取出。 模式是这样的:字段选择()作为queryset?

class Province(models.Model): 
    name = models.CharField(max_length=30) 
    slug = models.SlugField(max_length=30) 

    def __unicode__(self): 
     return self.name 

它的行这只能由管理员添加,但所有用户都可以看到它的形式。 我想从中做一个ModelForm。我做了这样的事情:

class ProvinceForm(ModelForm): 
    class Meta: 
     CHOICES = Province.objects.all() 

     model = Province 
     fields = ('name',) 
     widgets = { 
      'name': Select(choices=CHOICES), 
     } 

但它不起作用。选择标记不显示在HTML中。我错了什么?

UPDATE:

此解决方案,因为我wanto它的工作:

class ProvinceForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ProvinceForm, self).__init__(*args, **kwargs) 
     user_provinces = UserProvince.objects.select_related().filter(user__exact=self.instance.id).values_list('province') 
     self.fields['name'].queryset = Province.objects.exclude(id__in=user_provinces).only('id', 'name') 

    name = forms.ModelChoiceField(queryset=None, empty_label=None) 

    class Meta: 
     model = Province 
     fields = ('name',) 

回答

6

ModelForm涵盖了您所有的需求(同时检查Conversion List

型号:

class UserProvince(models.Model): 
    user = models.ForeignKey(User) 
    province = models.ForeignKey(Province) 

形式:

class ProvinceForm(ModelForm): 
    class Meta: 
     model = UserProvince 
     fields = ('province',) 

查看:

if request.POST: 
     form = ProvinceForm(request.POST) 
     if form.is_valid(): 
      obj = form.save(commit=True) 
      obj.user = request.user 
      obj.save() 
    else: 
     form = ProvinceForm() 
+0

我已更新我的文章与工作解决方案。 – robos85 2011-02-24 13:05:29

+6

+1:但它不应该'提交= False',否则你会打两次分贝 – 2011-12-18 14:43:02

11

阅读Maersu的答案,只是 “工作” 的方法。

如果你想定制,知道选择需要一个元组列表,即(('val','display_val'), (...), ...)

选择DOC:

可迭代(例如,列表或元组)的 2元组用作此 字段的选项。

from django.forms.widgets import Select 


class ProvinceForm(ModelForm): 
    class Meta: 
     CHOICES = Province.objects.all() 

     model = Province 
     fields = ('name',) 
     widgets = { 
      'name': Select(choices=((x.id, x.name) for x in CHOICES)), 
     } 
+0

嗨@yuij,我没有使用ModelForm,但我有一个类似的需求,我需要从模型中charfield上queryset的选择本身。我试过你的建议方式,但在我的情况下,它给了我错误,如“django.core.exceptions.AppRegistryNotReady:模型尚未加载。”,它说模型尚未加载。因此,任何想法我们如何才能实现它模型? – CrazyGeek 2016-02-09 02:38:03

+0

@CrazyGeek无论你注入的是哪种方式,如果它在模型类的init时间被调用(即在App准备好之前),它将成为一个静态值。直到重新启动才会形成。您应该确保它在ModelForm或每个请求执行的相关* view *代码中。 – 2016-02-09 15:09:59

+0

我没有使用ModelForm,因为我只使用django作为rest api。 – CrazyGeek 2016-02-10 06:39:46