2013-03-19 101 views
0

我想在使用基于标准类的视图和表单库的Django中创建一个对象。我的表单中的三个字段依赖于从URL模式捕获的域变量。我的问题是:Django:在基于类的视图和表单中访问URL变量

  • 如何访问domainCreateSubscription,这样我可以设置Subscription.siteSite.objects.filter(domain=domain)[0]
  • 如何限制从CreateSubscriptionForm呈现的下拉字段,以便​​仅显示SubscriptionPlan.objects.filter(site=Site.objects.filter(domain=domain)[0])payment_profile仅限于PaymentProfile.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',) 

回答

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) 
+0

太棒了。奇迹般有效。谢谢,Ngenator! – Wes 2013-03-19 23:54:17

+0

没问题,很高兴我能帮上忙。 – Ngenator 2013-03-20 00:26:10

相关问题