0

userを持つイベントを作成させる必要がありCategoryます。ユーザーが create_event ページに移動するとdropdown listCategoryインスタンスが表示されますCategory。作成されたもののみuserがドロップダウン リストに表示されるようにする必要があります。

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

誰かがこれで私を助けることができますか?

4

2 に答える 2

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
                                                                        )
于 2012-11-08T08:32:00.267 に答える
1

モデルを HTML フォームとして公開する場合は、単純なフォームではなくModelFormを使用することを常にお勧めします。もちろん、奇妙なことや複雑なことをたくさんしていて、単純なフォームを作成する方が簡単でない限り.

だからあなたの状況では

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ます。

于 2012-11-08T08:28:48.790 に答える