Python 无法从modelform中自动拾取外键
我正在Python 2.7/Django 1.7上开发一个产品应用程序 我有一个产品模型,即“product_profile”,我希望允许我的客户最终用户使用表单询问有关特定产品的任何问题 但是,我无法允许用户自动选择产品外键,客户必须从下拉列表中进行选择,这非常不合理。我还在url变量中分配了外键 这是我的密码: MODEL.PY FORM.PY VIEWS.PY URL模式 模板:product_inquiry2.htmlPython 无法从modelform中自动拾取外键,python,django,django-1.7,modelform,Python,Django,Django 1.7,Modelform,我正在Python 2.7/Django 1.7上开发一个产品应用程序 我有一个产品模型,即“product_profile”,我希望允许我的客户最终用户使用表单询问有关特定产品的任何问题 但是,我无法允许用户自动选择产品外键,客户必须从下拉列表中进行选择,这非常不合理。我还在url变量中分配了外键 这是我的密码: MODEL.PY FORM.PY VIEWS.PY URL模式 模板:product_inquiry2.html 我该怎么办?您从url中的id知道产品是什么,因此无需将其包含在表单
我该怎么办?您从url中的id知道产品是什么,因此无需将其包含在表单中 要检查数据库中是否存在该产品,可以使用get\u object\u或\u 404快捷方式
def product_inquiry(request, product_id):
product = get_object_or_404(ProductProfile, pk=product_id)
然后将“产品”从字段列表中删除,并删除带有隐藏输入小部件的ModelChoiceField
class Customer_ps_contactForm(forms.ModelForm):
class Meta:
model = Customer_ps_contact
fields = ('name','email','subject','message','phone_number')
当您保存产品时,您已经在设置它了,但是使用变量名实例可以使它更清楚地显示发生了什么。如果您更改了mail\u customer\u enquiry和thank\u\u customer方法以使用实例而不是已清理的\u数据,则不必对form.cleaned\u数据执行任何操作
您可以通过url中的id知道产品是什么,因此无需将其包含在表单中 要检查数据库中是否存在该产品,可以使用get\u object\u或\u 404快捷方式
def product_inquiry(request, product_id):
product = get_object_or_404(ProductProfile, pk=product_id)
然后将“产品”从字段列表中删除,并删除带有隐藏输入小部件的ModelChoiceField
class Customer_ps_contactForm(forms.ModelForm):
class Meta:
model = Customer_ps_contact
fields = ('name','email','subject','message','phone_number')
当您保存产品时,您已经在设置它了,但是使用变量名实例可以使它更清楚地显示发生了什么。如果您更改了mail\u customer\u enquiry和thank\u\u customer方法以使用实例而不是已清理的\u数据,则不必对form.cleaned\u数据执行任何操作
我不明白你在问什么。您已经在is_valid块中手动分配产品,那么有什么问题吗?我不明白您在问什么。您已经在is_valid块中手动分配了产品,那么问题出在哪里?实际上,最好让这些方法在实例上运行,而不是在清理的_数据块上运行。谢谢!但问题是,如果我排除外键,即产品配置文件,则模型表单不会被验证。@MuhammadAhmed你说模型表单没有被验证是什么意思?你是说表格有错误吗?在这种情况下,会出现什么错误?或者你的意思是没有检查产品标识?在这种情况下,在视图中使用get_object_或_404。现在就可以了。我一直在使用“排除”,表单无法保存。您删除了clean_data dict,那么数据清理呢?您使用的是模型表单,因此在调用form.is_valid时会验证数据。保存表单后,您可以从实例(例如form.email)中获取值,因此通常不需要直接访问form.cleaned_数据。实际上,最好让这些方法在实例上运行,而不是在cleaned_数据上运行。谢谢!但问题是,如果我排除外键,即产品配置文件,则模型表单不会被验证。@MuhammadAhmed你说模型表单没有被验证是什么意思?你是说表格有错误吗?在这种情况下,会出现什么错误?或者你的意思是没有检查产品标识?在这种情况下,在视图中使用get_object_或_404。现在就可以了。我一直在使用“排除”,表单无法保存。您删除了clean_data dict,那么数据清理呢?您使用的是模型表单,因此在调用form.is_valid时会验证数据。保存表单后,您可以从实例(例如form.email)获取值,因此通常不需要直接访问form.u数据。
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block body_block %}
{% block title %}Product Inquiry{% endblock %}
<div class="row">
<div class="col-md-10 col-md-offset-1">
<h2 style="font-weight:bold">Enquiry regarding '{{product.product_name}}'</h2>
<hr>
<form id="contact_form" method="post" action=""/>
{% csrf_token %}
{{ form | crispy }}
<input class="btn btn-primary pull-right " type="submit" name="submit" value="Submit the Message" />
</form>
</div>
</div>
{% endblock %}
def product_inquiry(request, product_id):
product = get_object_or_404(ProductProfile, pk=product_id)
class Customer_ps_contactForm(forms.ModelForm):
class Meta:
model = Customer_ps_contact
fields = ('name','email','subject','message','phone_number')
if form.is_valid():
instance = form.save(commit=False)
instance.product = product
instance.save()
mail_customer_enquriy(instance) # Function to send email to admin
thank_u_customer(instance) # Function to send email to customers
return home(request)