限制模型模型字段中的值 [英] Limit values in the modelformset field
问题描述
我一直在试图解决这个问题几天,现在非常绝望。查看已注销的代码片段,了解我尝试过的一些事情,但没有起作用。
问题:如何限制 c code> c> c> c> c> c> c> c> c
views.py
@login_required
def apphome(request) :
IngrFormSet = modelformset_factory(成分,extra = 1,fields =('name','category'))
#尝试#1(不工作;错误:'IngredientFormFormSet'没有属性'fields')
#ingrformset = IngrFormSet(prefix ='ingr',queryset = Ingredient.objects.none())
#ingrformset.fields ['category']。queryset = Category.objects .filter(user = request.user)
#尝试#2(不工作)
#ingrformset = IngrFormSet(prefi x ='ingr',queryset = Ingredient.objects.filter(category__user_id = request.user.id)
models.py:
class Category(models.Model):
name = models.CharField(max_length = 30,unique = True)
user = models.ForeignKey(User,null = True,blank = True)
class Ingredient(models.Model) b $ b name = models.CharField(max_length = 30,unique = True)
user = models.ForeignKey(User,null = True,blank = True)
category = models.ForeignKey(Category,null = true,blank = True)
counter = models.IntegerField(default = 0)
forms.py
class IngredientForm(ModelForm):
class Meta:
model = Ingredient
fields =('name','category')
更新:我已经取得了一些进展,但解决方案目前是硬编码,并不真正可用:
我发现我可以通过表单类控制类别
表单域,然后在这样的视图中传递表单:
#forms.py
pre>
class IngredientForm(ModelForm):
category = forms.ModelChoiceField(queryset = Category.objects.filter(user_id = 1))
class Meta:
model = Ingredient
fields =('name','category')
#views.py
IngrFormSet = modelformset_factory(Ingredient,form = IngredientForm,extra = 1,fields =('name','category'))
上述产生了我需要的结果,但显然
用户
是硬编码的。我需要它是动态的(即当前用户)。我尝试了一些解决方案来访问forms.py中的request.user,但这些方法不起作用。
任何想法如何前进?
解决方案您不需要任何类型的自定义表单。您可以将
类别
字段的查询更改为:IngrFormSet = modelformset_factory (成分,extra = 1,fields =('name','category'))
IngrFormSet.form.base_fields ['category']。queryset = Category.objects.filter(user__id = request.user.id)
I've been trying to solve this problem for a couple of days now, getting quite desperate. See the commented out code snippets for some of the things I've tried but didn't work.
Problem: How can I limit the values in the
category
field of theIngredientForm
to only those belonging to the currently logged in user?views.py
@login_required def apphome(request): IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category')) # Attempt #1 (not working; error: 'IngredientFormFormSet' object has no attribute 'fields') # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.none()) # ingrformset.fields['category'].queryset = Category.objects.filter(user=request.user) # Attempt #2 (doesn't work) # ingrformset = IngrFormSet(prefix='ingr', queryset=Ingredient.objects.filter(category__user_id = request.user.id))
models.py:
class Category(models.Model): name = models.CharField(max_length=30, unique=True) user = models.ForeignKey(User, null=True, blank=True) class Ingredient(models.Model): name = models.CharField(max_length=30, unique=True) user = models.ForeignKey(User, null=True, blank=True) category = models.ForeignKey(Category, null=True, blank=True) counter = models.IntegerField(default=0)
forms.py:
class IngredientForm(ModelForm): class Meta: model = Ingredient fields = ('name', 'category')
UPDATE: I've made some progress but the solution is currently hard-coded and not really usable:
I found out I can control the
category
form field via form class and then pass the form in the view like this:#forms.py class IngredientForm(ModelForm): category = forms.ModelChoiceField(queryset = Category.objects.filter(user_id = 1)) class Meta: model = Ingredient fields = ('name', 'category') #views.py IngrFormSet = modelformset_factory(Ingredient, form = IngredientForm, extra=1, fields=('name', 'category'))
The above produces the result I need but obviously the
user
is hardcoded. I need it to be dynamic (i.e. current user). I tried some solutions for accessing the request.user in forms.py but those didn't work.Any ideas how to move forward?
解决方案You don't need any kind of custom forms. You can change the queryset of
category
field as:IngrFormSet = modelformset_factory(Ingredient, extra=1, fields=('name', 'category')) IngrFormSet.form.base_fields['category'].queryset = Category.objects.filter(user__id=request.user.id)
这篇关于限制模型模型字段中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!