0

以下のモデルを入手しました。

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

class ProjectParticipation(models.Model):
    user = models.ForeignKey(User)
    project = models.ForeignKey(Project)

class Receipt(models.Model):
    project_participation = models.ForeignKey(ProjectParticipation)

さらに、次の CreateView があります。

class ReceiptCreateView(LoginRequiredMixin, CreateView):
    form_class = ReceiptForm
    model = Receipt
    action = 'created'

ユーザーがプロジェクトを選択できるドロップダウンメニューが必要になりました。新しい領収書が必要です。ユーザーには、自分が割り当てられているプロジェクトのみが表示されます。どうやってやるの?

4

2 に答える 2

0

ModelChoiceField を使用して解決策を見つけました。

class ProjectModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.project

class ReceiptForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ReceiptForm, self).__init__(*args, **kwargs)
        self.fields['project_participation'] = ProjectModelChoiceField(queryset= ProjectParticipation.objects)
class Meta:
    model = Receipt

そしてCreateViewで:

class ReceiptCreateView(...)
    def get_form(self, form_class):
        form = super(ReceiptCreateView, self).get_form(form_class)
        form.fields['project_participation'].queryset = ProjectParticipation.objects.filter(user=self.request.user)
        return form

ModelForm でクエリ セットを直接フィルタリングするソリューションはありますか?

于 2013-03-25T12:30:47.070 に答える
0

簡単な答えは、ドキュメントを読んでモデルフォームを作成することです。これは基本です。

また、FK で逆を取得できるように、関連する名前を確認することもできます。

class ProjectParticipation(models.Model):
    user = models.ForeignKey(User)
    project = models.ForeignKey(Project, related_name='ProjectParticipation')
于 2013-03-25T10:58:37.233 に答える