14

1つの選択と1つのテキスト入力を持つフォームを作成する必要があります。選択はデータベースから取得する必要があります。モデルは次のようになります。

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に表示されません。私は何を間違えましたか?

アップデート:

このソリューションは、私が望むように機能します。

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',)
4

4 に答える 4

19

「うまくいく」方法については、マエルスの答えを読んでください。

カスタマイズしたい場合は、choices がタプルのリストを取ることを知っておいてください。 (('val','display_val'), (...), ...)

選択肢ドキュメント:

このフィールドの選択肢として使用する 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 )),
        }
于 2011-02-24T13:08:39.743 に答える
6

ModelFormはすべてのニーズをカバーします (変換リストも確認してください)

モデル:

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() 
于 2011-02-24T12:50:05.000 に答える