2014-02-09 6 views
0

Я создал представление, в котором пользователи могли обновлять подписки в своих профилях, но когда я пошел добавлять нового пользователя, я понял, что не думал о создании новых подписчиков. Так что у меня было:Создание новых объектов с помощью Django ModelForm

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

Поскольку не было ни одного случая объекта Customer_Subscription что запрос был неудачным. Я пробовал несколько вещей как «исключения», но никто, похоже, не работает, и я не знаю, если они близки к правильности. Ищите какую-то помощь.

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

ответ

0

get_or_create;

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

создать Customer_Subscription объект, если он не существует.

+0

Спасибо. Subbing это на самом деле дал мне ошибку, потому что я не понял, что он вернул кортеж. Решено объявить как cust_subscription_instance, created = Customer_Subscription.objects.get_or_create (user = request.user) – user3184033

+0

Да, извините, я забыл упомянуть, что: / – iskorum

0

В общем, используйте DoesNotExists, чтобы проверить получить отказ. Оберните только вызов get с ним.

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

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") 
) 

и create_customer_subscription.html

{% extends 'base.html' %} 
{% block content_main %} 
    <form method="post"> 
     {% csrf_token %} 
     {{ form }} 
     <input type="submit"/> 
    </form> 
{% endblock %} 
Смежные вопросы