限制模型模型字段中的值 [英] Limit values in the modelformset field

查看:100
本文介绍了限制模型模型字段中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在试图解决这个问题几天,现在非常绝望。查看已注销的代码片段,了解我尝试过的一些事情,但没有起作用。



问题:如何限制 c code> c> c> 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 
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'))
pre>

上述产生了我需要的结果,但显然用户是硬编码的。我需要它是动态的(即当前用户)。我尝试了一些解决方案来访问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 the IngredientForm 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 categoryform 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆