【问题标题】:Django: Accessing URL variables in Class Based Views and FormsDjango:在基于类的视图和表单中访问 URL 变量
【发布时间】:2013-03-08 20:41:47
【问题描述】:

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

  • 如何在CreateSubscription 中访问domain,以便将Subscription.site 设置为Site.objects.filter(domain=domain)[0]?
  • 如何限制从CreateSubscriptionForm 呈现的下拉字段,以便plan 仅显示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 方法。 :)

网址格式为:

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', )

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    要访问传递给视图的数据,请使用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)
    

    【讨论】:

    • 太棒了。奇迹般有效。谢谢,Ngenator!
    • 没问题,很高兴我能帮上忙。
    猜你喜欢
    • 2018-02-20
    • 2013-09-23
    • 2012-12-28
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2015-05-08
    • 2020-12-07
    相关资源
    最近更新 更多