2012-11-08 116 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 
                     )