1

標準のクラスベースのビューとフォームライブラリを使用して、Djangoでオブジェクトを作成しようとしています。私のフォームの3つのフィールドは、URLパターンからキャプチャされたドメイン変数に依存しています。私の質問は次のとおりです。

  • に設定できるように、domain内にアクセスするにはどうすればよいですか?CreateSubscriptionSubscription.siteSite.objects.filter(domain=domain)[0]
  • 表示のみに制限されるCreateSubscriptionFormように、レンダリング元のドロップダウンフィールドを制限するにはどうすればよいですか?planSubscriptionPlan.objects.filter(site=Site.objects.filter(domain=domain)[0])payment_profilePaymentProfile.objects.filter(user=request.user)

わかりやすくするために、のドメインはr'^subscribe/(?P<domain>\w+\.\w+)/$'自分のサイトのドメインとは無関係です。フレームワークはここdjango.contrib.sitesでは役に立ちません。

これらすべてのCBVメソッドを解くのを手伝ってくれてありがとう。:)

URLパターンは次のとおりです。

from django.conf.urls import patterns, url
from accounts.views import *

url(r'^subscribe/(?P<domain>\w+\.\w+)/$', 
    CreateSubscription.as_view(), name='subscribe_to_site'),
)

問題のビューは次のとおりです。

from accounts.forms import *
from accounts.models import *

class CreateSubscription(CreateView):
    model = Subscription
    form_class = CreateSubscriptionForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(CreateSubscription, self).form_valid(form)

関連するモデルは次のとおりです。

from django.conf import settings
from django.contrib.sites.models import Site
from django.db import models

class PaymentProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

class SubscriptionPlan(models.Model):
    site = models.ForeignKey(Site)
    name = models.CharField(max_length=40)

class Subscription(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    site = models.ForeignKey(Site)
    plan = models.ForeignKey(SubscriptionPlan)
    payment_profile = models.ForeignKey(PaymentProfile)

そして最後に、私のフォームは次のとおりです。

from accounts.models import *

class CreateSubscriptionForm(forms.ModelForm):
    class Meta:
        model = Subscription
        exclude = ('user', 'site', )
4

1 に答える 1

2

ビューに渡されたデータにアクセスするにはself.argsself.kwargs

from accounts.forms import *
from accounts.models import *

class CreateSubscription(CreateView):
    model = Subscription
    form_class = CreateSubscriptionForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.site = Site.objects.get(domain=self.kwargs['domain'])
        return super(CreateSubscription, self).form_valid(form)

querysetドロップダウンコンテンツを制限するには、これらのフィールドにを設定する必要があります。非常に基本的に、これらの線に沿った何か:

class CreateSubscriptionForm(forms.ModelForm):
    plan = forms.ModelChoiceField(
        queryset=SubscriptionPlan.objects.filter(xxx)
    )

    ...

    class Meta:
        model = Subscription
        exclude = ('user', 'site', )

これは、ドメインにアクセスできるように、ビュー内で実行することもできます。

class CreateSubscription(CreateView):
    model = Subscription
    form_class = CreateSubscriptionForm

    def get_form(self, form_class):
        """
        Returns an instance of the form to be used in this view.
        """
        form = super(CreateSubscription, self).get_form(form_class)
        form.fields['plan'].queryset = SubscriptionPlan.objects.filter(site__domain=self.kwargs['domain'])
        return form

    ...

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.site = Site.objects.get(domain=self.kwargs['domain'])
        return super(CreateSubscription, self).form_valid(form)
于 2013-03-19T23:07:49.043 に答える