Django:在基于类的视图和表单中访问URL变量
我试图使用标准的基于类的视图和表单库在Django中创建一个对象。我表单中的三个字段依赖于从URL模式捕获的域变量。我的问题是:Django:在基于类的视图和表单中访问URL变量,django,django-views,Django,Django Views,我试图使用标准的基于类的视图和表单库在Django中创建一个对象。我表单中的三个字段依赖于从URL模式捕获的域变量。我的问题是: 如何访问CreateSubscription中的domain,以便将Subscription.site设置为site.objects.filter(domain=domain)[0] 如何限制从CreateSubscriptionForm呈现的下拉字段,以便plan仅显示SubscriptionPlan.objects.filter(site=site.object
- 如何访问
中的CreateSubscription
,以便将domain
设置为Subscription.site
site.objects.filter(domain=domain)[0]
- 如何限制从
呈现的下拉字段,以便CreateSubscriptionForm
仅显示plan
和SubscriptionPlan.objects.filter(site=site.objects.filter(domain=domain)[0])
仅限于PaymentProfile
PaymentProfile.objects.filter(user=request.user)
r'^subscribe/(?p\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 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', )
要访问传递到视图的数据,请使用
self.args
和self.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)
令人惊叹的。工作起来很有魅力。谢谢你,纳托尔!没问题,很高兴我能帮忙。
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)