在Django view中设置ModelChoiceField的选项
我们在使用Django中的ModelChoiceField时,可以通过queryset选项来设置这个字段对应的选项。通常这个queryset的设置都是在form中定义form类的时候来使用。其实,我们也可以在view中设置queryset,这样就给了我们更加灵活的控制。比如我们有下面的类:
class Category(models.Model):
user = models.ForeignKey(User, related_name="categories")
name = models.CharField(max_length=50)
class Book(models.Model):
category = models.ForeignKey(Category)
name = models.CharField(max_length=50)
class BookForm(form.ModelForm):
class Meta:
model = Book
在Book类中,把category作为一个外键,当我们使用ModelForm时,会自动使用ModelChoiceField,而这个Field的选项默认就是全部的目录。如果我们的需求是要把选项限制在当前登录用户创建的目录时,我们就需要动态来设置这个字段的选项。我们可以在view中通过下面的方式来实现:
def create_book(request):
form = BookForm()
form.base_fields['category'].queryset = request.user.categories.all()
......