2

ユーザーの「資格」のインラインフォームセットを表示するページを生成するために、views.pyに次のものがあります

from django.db.models import User
from models import UserQualification

def edit_quals(request):
    QualsFormSet = inlineformset_factory(User, UserQualification, fields=('qualification', 'qualification_year', 'qualification_source'))
    if request.method == 'POST':
        formset = QualsFormSet(request.POST, request.FILES, instance = request.user)
        if formset.is_valid():
            formset.save()

            #send user somewhere
            return HttpResponseRedirect(request.user.get_profile_url())
    else:
        formset = QualsFormSet(instance = request.user)

    return render_to_response("edit_quals.html", {
        "formset": formset,
    }, context_instance=RequestContext(request))

これは問題なく動作しますが、formset特定の 'UserQualification' オブジェクト (つまり、特定のタイプとしてマークされているオブジェクトのみ) のみを含む を作成して、ユーザーがこのページにアクセスしたときに資格のサブセットのみを編集するようにしたいと考えています。 . この参照は私が欲しいもののようです: http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#ching-the-queryset。これは modelformset_factory を扱いますが、inlineformset_factory は事前に基づいているため、同じことが機能するはずです。

formset = QualsFormSet(instance = request.user, queryset=UserQualification.objects.filter(type__startswith='xyz'))

しかし、このページに行くと、TypeError: init () が予期しないキーワード引数 'queryset' を取得しました。そのリファレンスには 2 つの方法がリストされていますが、どちらにも問題があります。

4

2 に答える 2

2

ここで、この問題の少し単純なバージョンに対する回答を提供しました: Django の inlineformset_factory を制限して、新しいオブジェクトのみを作成する

あなたがしようとしていたことに対して、InlineFormSet クラスは代わりに次のようになります。

class BaseInlineFilteredFormSet(BaseInlineFormSet):
    def get_queryset(self):
        ## See get_queryset method of django.forms.models.BaseModelFormSet
        if not hasattr(self, '_queryset'):
            self._queryset = self.queryset.filter(type__startswith='xyz'))
            if not self._queryset.ordered:
                self._queryset = self._queryset.order_by(self.model._meta.pk.name)                
        return self._queryset
于 2011-03-02T10:28:50.873 に答える
0

この場合、 inlineformset_factory を呼び出すときにフォームパラメータを使用し、アドホック__init__メソッドで作成したカスタム フォームを渡す必要があると思います。パラメトリックにする必要がある場合は、ここでしばらく前に見つけました-節約線

    FormSetName.form = staticmethod(curry(FormName, customparam=chosenparam))

上記で説明したように、FormSetName はFormName を指すフォームパラメータで定義されています。

ところで、上記の解決策を提案してくれた人を称賛したいと思います。心温まる返事を残したいと思っていましたが、評判が少なすぎました。

私の解決策をよりよく説明するために編集してください:

これはカスタムフォームクラスになります (この場合、人をrelativeとして選択しますが、 relatives()メソッドによって返される人のサブセットのみ):

class RelativeSelectForm(forms.ModelForm):
class Meta:
    model = Person
    fields = ('relative',)

def __init__(self, *args, **kwargs):
    try:
        profile = kwargs.pop('profile')
    except KeyError:
        super(RelativeSelectForm, self).__init__(*args, **kwargs)
        return
    super(RelativeSelectForm, self).__init__(*args, **kwargs)
    self.fields['relative'].queryset = profile.relatives().order_by('name')

そして、それはあなたのvies.pyで次のように使用されます:

RelativesFormSet = inlineformset_factory(Person, Person, form=RelativeSelectForm, can_delete=True, extra=1)
RelativesFormSet.form = staticmethod(curry(RelativeSelectForm, profile=request.user.profile))

フォームセットをインスタンス化するたびに、適切なオブジェクトで満たされたプロファイルパラメーターが自動的に取得され、相対選択ボックスのクエリセットには、アクセスできる人のみが表示されます。私が自分自身を少し明確にしたことを願っています:)

于 2010-11-10T13:43:17.293 に答える