2

重複の可能性:
Django ModelFormでForeignKeyの選択をフィルタリングするにはどうすればよいですか?

次のようなモデルがあるとします。

from django.db import models
from django.contrib.auth.models import User

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    owner = models.ForeignKey(User)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    owner = models.ForeignKey(User)

BookモデルのModelFormを作成すると、ユーザーは自分が所有する著者だけでなく、すべての著者から選択できるようになります。ユーザーが自分が所有する著者のみを選択できるようにするBookモデルのModelFormを作成するにはどうすればよいですか?

4

1 に答える 1

4

モデルフォームの__init__メソッドをオーバーライドして、作成者モデル選択フィールドのクエリセットを制限できます。

class BookForm(forms.ModelForm):

    class Meta:
        model = Book
        # exclude the owner and set it in the view
        exclude = ('owner',) 

    def __init__(self, *args, **kwargs):
        super(BookForm, self).__init__(*args, **kwargs)
        if self.instance.owner:
            self.fields['author'].queryset = Author.objects.filter(owner=self.instance.owner)

ビューでは、所有者がすでに設定されているインスタンスを使用してフォームをインスタンス化するようにしてください。たとえば、本を追加すると、次のようになります。

def add_book(request):
    book = Book(owner=request.owner)
    form = BookForm(data=request.POST or None, instance=book)
    if form.is_valid():
        book.save()
        return HttpResponseRedirect('/success-url/')
    return render(request, "my_template.html", {'form': form})
于 2012-07-07T05:49:16.560 に答える