使用Django ModelForm创建新对象

使用Django ModelForm创建新对象,django,forms,model,Django,Forms,Model,我创建了一个视图,用户可以在其配置文件中更新订阅,但当我添加新用户时,我意识到我没有考虑创建新订阅。所以我得到的是: models.py class Customer_Subscription(models.Model): user = models.ForeignKey(User) customers = models.ManyToManyField('Customers', blank=True) def __unicode__(self): retu

我创建了一个视图,用户可以在其配置文件中更新订阅,但当我添加新用户时,我意识到我没有考虑创建新订阅。所以我得到的是:

models.py

class Customer_Subscription(models.Model):
    user = models.ForeignKey(User)
    customers = models.ManyToManyField('Customers', blank=True)
    def __unicode__(self):
        return (self.user)
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)
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/')
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/')
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)
因为没有Customer_订阅对象的实例,所以该查询失败。我试过几种方法作为“例外”,但似乎都不起作用,我不知道哪种方法接近正确。正在寻求帮助

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

通常,使用DoesNotExists检查get失败。用它只包装get呼叫

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

您可以使用
获取或创建

Customer_Subscription.objects.get_or_create(user=request.user)
创建
客户订阅
对象(如果不存在)。

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/')
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/')
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 Customer_Subscription(models.Model):
    user = models.ForeignKey(User)
    customers = models.ManyToManyField('Customers', blank=True)
    def __unicode__(self):
        return (self.user)
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)
url.py

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

{% extends 'base.html' %}
{% block content_main %}
    <form method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit"/>
    </form>
{% endblock %}
{%extends'base.html%}
{%block content\u main%}
{%csrf_令牌%}
{{form}}
{%endblock%}

谢谢。将它代入实际上给了我一个错误,因为我没有意识到它返回了一个元组。通过声明为cust_subscription_实例,created=Customer_subscription.objects.get_或_create(user=request.user)来解决此问题。是的,很抱歉,我忘了提及:/