使用Django ModelForm创建新对象
我创建了一个视图,用户可以在其配置文件中更新订阅,但当我添加新用户时,我意识到我没有考虑创建新订阅。所以我得到的是: models.py使用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
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)来解决此问题。是的,很抱歉,我忘了提及:/