2013-03-19 3 views
0

J'essaie de créer un objet dans Django en utilisant les bibliothèques de classes et de vues basées sur une classe standard. Trois champs de mon formulaire dépendent d'une variable de domaine capturée à partir du modèle d'URL. Mes questions sont les suivantes:Django: Accès aux variables d'URL dans les vues et les formulaires basés sur une classe

  • Comment puis-je accéder domain au sein CreateSubscription afin que je puisse mettre Subscription.site-Site.objects.filter(domain=domain)[0]?
  • Comment puis-je limiter les champs déroulants rendus de CreateSubscriptionForm de sorte que plan affiche uniquement SubscriptionPlan.objects.filter(site=Site.objects.filter(domain=domain)[0]) et payment_profile est limité à PaymentProfile.objects.filter(user=request.user)?

Par souci de clarté, le domaine dans r'^subscribe/(?P<domain>\w+\.\w+)/$' est sans rapport avec le domaine de mon propre site. Le cadre django.contrib.sites ne m'aidera pas ici. Merci d'avance de m'avoir aidé à démêler toutes ces méthodes CBV. :)

Le modèle d'URL est:

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

La vue en question est:

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) 

Les modèles concernés sont les suivants:

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) 

Et, enfin, ma forme est :

from accounts.models import * 

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

Répondre

2

Pour accéder aux données transmises à la vue, utilisez self.args et 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) 

Pour limiter le contenu déroulant, vous devez définir le queryset pour les champs. Très gros, quelque chose le long de ces lignes:

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

    ... 

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

Cela peut aussi être fait à l'intérieur de la vue afin que vous ayez accès au domaine.

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

Impressionnant. Fonctionne comme un charme. Merci, Ngenator! – Wes

+0

Pas de problème, content de pouvoir aider. – Ngenator

Questions connexes