2012-11-08 113 views
0

我需要讓一個user創建具有Category。當用戶進入到create_event頁的事件,他被出示一張dropdown listCategory instances.I的需要,以確保只有那些由user創建的Category應顯示在下拉列表中使用Django表單子類來創建一個下拉列表

我試圖爲此子類Form子類,我可以在視圖和模板中使用它。

模板create_event:

<h3>select from existing categories</h3> 
{{category_choices_form.as_p}} 

視圖create_event:

def create_event(request,..): 
    user_categories = Category.objects.filter(creator=request.user) 
    form_data = get_form_data(request) 
    category_choices_form = CategoryChoicesForm(request.user,form_data)# is this correct? 
    ... 

def get_form_data(request): 
    return request.POST if request.method == 'POST' else None 

然後,我創建了Form

class CategoryChoicesForm(forms.Form): 
    def __init__(self, categorycreator,*args, **kwargs): 
     super(CategoryChoicesForm, self).__init__(*args, **kwargs) 
     self.creator=categorycreator 
    categoryoption = forms.ModelChoiceField(queryset=Category.objects.filter(creator=self.creator),required=False,label='Category') 

然而,行開始categoryoption =原因錯誤說name 'self' is not defined

有人可以幫助我嗎?

回答

1

當你有一個要公開爲HTML表單的模型,總是喜歡 使用ModelForm,而不是一個簡單的形式。除非你正在做 很多奇怪或複雜的東西,並且構建一個簡單的表單更直接。

所以在你situtation

from django.forms import ModelForm 

class CategoryForm(ModelForm): 
    class Meta: 
     model = Category 
     # exclude = ('blah', 'foo') # You can exclude fields from your model, if you dont want all of them appearing on your form. 

get_form_data功能是不必要的。這是你如何使用您的形式在視圖中

from django.template import RequestContext 
from django.shortcuts import render_to_response 

def create_event(request,..): 
    if request.method == 'POST': 
     form = CategoryForm(request.POST) 
     if form.is_valid(): 
      # do stuff and redirect the user somewhere 

    else: 
     # We're in a GET request, we just present the form to the user 
     form = CategoryForm() 
    return render_to_response('some_template.html', {'form':form}, context_instance=RequestContext(request)) 

關於self is not defined錯誤:

CategoryChoicesForm你有這條線

categoryoption = forms.ModelChoiceField(queryset=Category.objects.filter(creator=self.creator),required=False,label='Category') 

這是在一流水平,當self只能在instance級別上使用。 self在那裏不「可見」。但在CategoryChoicesForm的方法中可見。

1

與形式,你應該以這種方式更改查詢集工作:

class CategoryChoicesForm(forms.Form): 
    categoryoption = forms.ModelChoiceField(
          queryset = Category.objects.none(), 
          required=False,label='Category') 

    def __init__(self, categorycreator,*args, **kwargs): 
     super(CategoryChoicesForm, self).__init__(*args, **kwargs) 
     self.creator=categorycreator 
     self.fields['categoryoption'].queryset = Category.objects.filter( 
                  creator=self.creator 
                     )