1

I created a view where users could update subscriptions in their profiles, but when i went to add a new user i realized that i hadn't figured in creating new subscriptions. So what i had was:

models.py

class Customer_Subscription(models.Model):
    user = models.ForeignKey(User)
    customers = models.ManyToManyField('Customers', blank=True)
    def __unicode__(self):
        return (self.user)

forms.py

class CustomerSubscriptionForm(forms.ModelForm):
    class Meta:
        model = Customer_Subscription
        fields = ['customers']

views.py

def profile(request):
    if request.method == 'POST':
        cust_subscription_instance = Customer_Subscription.objects.get(user=request.user.id)
        customer_subscription = CustomerSubscriptionForm(request.POST, instance=cust_subscription_instance)
        if customer_subscription.is_valid() and level_subscription.is_valid() and profile_form.is_valid():
            customer_subscription.save(commit=True)
            return HttpResponseRedirect('/profile/')

Since there was no instance of the Customer_Subscription object that query was failing. I've tried several things as "exceptions" but none seem to work, and i don't know which if any are close to being correct. Looking for some help.

views.py

try:
    cust_subscription_instance = Customer_Subscription.objects.get(user=request.user.id)
    customer_subscription = CustomerSubscriptionForm(request.POST, instance=cust_subscription_instance)
    if customer_subscription.is_valid() and level_subscription.is_valid() and profile_form.is_valid():
        customer_subscription.save(commit=True)
        return HttpResponseRedirect('/profile/')
except:
    customer_subscription = CustomerSubscriptionForm(request.user.id, request.POST)
    if customer_subscription.is_valid():
        customer_subscription.save(commit=True)
         level_subscription.save(commit=True)
         return HttpResponseRedirect('/profile/')

3 Answers 3

3

views.py

class ViewSuccess(TemplateView):
    template_name = 'frontend/view_success.html'

class CreateCustomerSubscription(UpdateView):
    template_name = 'frontend/create_customer_subscription.html'
    success_url = 'frontend:view_success'

    def get_success_url(self):
        return reverse('frontend:view_success')

    def get_object(self, queryset=None):
        try:
            return self.request.user.customersubscription
        except CustomerSubscription.DoesNotExist:
            return CustomerSubscription.objects.create(user=self.request.user)


    def get_form_class(self):
        class _Form(forms.ModelForm):
            class Meta:
                model = CustomerSubscription
                fields = ['customers']

        return _Form

    def form_valid(self, form):
        self.object = form.save(commit=False)

        self.object.user = self.request.user              
        self.object.save()

        form.save_m2m()

        return super(ModelFormMixin, self).form_valid(form)

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(CreateCustomerSubscription, self).dispatch(request, *args, **kwargs)

models.py

class CustomerSubscription(models.Model):
    user = models.OneToOneField(User)
    customers = models.ManyToManyField('Customer', blank=True)

    def __unicode__(self):
        return self.user.username

class Customer(models.Model):
    name = models.CharField(max_length=255)

urls.py

urlpatterns = patterns('',
    url(r'^create/$', CreateCustomerSubscription.as_view(), name='create_customer_subscription'),
    url(r'^success/$', ViewSuccess.as_view(), name="view_success")
)

and create_customer_subscription.html

{% extends 'base.html' %}
{% block content_main %}
    <form method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit"/>
    </form>
{% endblock %}
Sign up to request clarification or add additional context in comments.

Comments

0

You can use get_or_create;

Customer_Subscription.objects.get_or_create(user=request.user)

to create Customer_Subscription object if it isn't exist.

2 Comments

Thanks. Subbing this in actually gave me an error because i didn't realize it returned a tuple. Resolved by declaring as cust_subscription_instance, created = Customer_Subscription.objects.get_or_create(user=request.user)
Yes, sorry i forgot to mention that :/
0

In general, use the DoesNotExists to check get failure. Wrap only the get call with it.

try:
    cust_subscription_instance = Customer_Subscription.objects.get(user=request.user.id)
except Customer_Subscription.DoesNotExists:
    cust_subscription_instance = None

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.