2012-11-07 44 views
-1

我試圖顯示一個表單(ModelForm),其中select字段由當前登錄的用戶篩選。這種情況下的選擇字段包含一個類別列表。我只想顯示「屬於」當前登錄用戶的類別。類別字段是IngredienceCategory模型的外鍵。通過當前登錄用戶篩選ModelForm中的選擇字段

這裏是我想出到目前爲止,但它給我一個錯誤(意外的關鍵字查詢集)。任何想法我做錯了什麼?

# models.py 
class IngredienceCategory(models.Model): 
    name = models.CharField(max_length=30) 
    user = models.ForeignKey(User, null=True, blank=True) 

    class Meta: 
    verbose_name_plural = "Ingredience Categories" 

    def __unicode__(self): 
     return self.name 


class Ingredience(models.Model): 
    name = models.CharField(max_length=30) 
    user = models.ForeignKey(User, null=True, blank=True) 
    category = models.ForeignKey(IngredienceCategory, null=True, blank=True) 

    class Meta: 
     verbose_name_plural = "Ingredients" 

    def __unicode__(self): 
     return self.name 


class IngredienceForm(ModelForm): 
    class Meta: 
     model = Ingredience 
     fields = ('name', 'category') 


# views.py 
def home(request): 
    if request.user.is_authenticated(): 
     username = request.user.username 
     email = request.user.email 
     foods = Food.objects.filter(user=request.user).order_by('name') 
     ingredients = Ingredience.objects.filter(user=request.user).order_by('name') 
     ingrcat = IngredienceCategory.objects.filter(user=request.user) 

     if request.method == 'POST': 
      form = IngredienceForm(request.POST) 
      if form.is_valid(): 
       # Create an instance of Ingredience without saving to the database 
       ingredience = form.save(commit=False) 
       ingredience.user = request.user 
       ingredience.save() 
     else: 
      # How to display form with 'category' select list filtered by current user? 
      form = IngredienceForm(queryset=IngredienceCategory.objects.filter(user=request.user)) 

     context = {} 
     for i in ingredients: 
      context[i.category.name.lower()] = context.get(i.category.name.lower(), []) + [i] 

     context2 = {'username': username, 'email': email, 'foods': foods, 'ingrcat': ingrcat, 'form': form,} 
     context = dict(context.items() + context2.items()) 
    else: 
     context = {} 

    return render_to_response('home.html', context, context_instance=RequestContext(request)) 

回答

1

這是因爲ModelForm沒有使用queryset關鍵字。

你或許可以通過設置視圖的查詢集實現這一點:

form = IngredienceForm() 
form.fields["category"].queryset = 
     IngredienceCategory.objects.filter(user=request.user) 

參閱相關的問題here

+0

第一個解決方案有效,但第二個解決方案不會基於用戶進行過濾。它會返回一整套。此外,您還鏈接了兩次相同的問題。 – finspin

+0

只是解決了問題,謝謝。 – dieb

相關問題