Python Django将外键传递给视图
嗨,也许有人能给我指出正确的方向,我正在通过与Django的探戈学习Django,我也在跟随官方的Django教程,并为采购订单创建我自己的Django应用程序 我需要了解如何访问另一个模型的外键详细信息并使用表单保存它。基本上,我的应用程序有订单和供应商。创建订单时,我可以让供应商外键选项显示在表单上,但当我保存它时,我还想将供应商名称保存到订单表中,当前它只保存供应商id,我已经搜索了很多不同场景的例子,但就是不明白,谢谢 view.pyPython Django将外键传递给视图,python,django,forms,model,Python,Django,Forms,Model,嗨,也许有人能给我指出正确的方向,我正在通过与Django的探戈学习Django,我也在跟随官方的Django教程,并为采购订单创建我自己的Django应用程序 我需要了解如何访问另一个模型的外键详细信息并使用表单保存它。基本上,我的应用程序有订单和供应商。创建订单时,我可以让供应商外键选项显示在表单上,但当我保存它时,我还想将供应商名称保存到订单表中,当前它只保存供应商id,我已经搜索了很多不同场景的例子,但就是不明白,谢谢 view.py def add_order(request):
def add_order(request):
if request.method == 'POST':
form = OrderForm(request.POST)
if form.is_valid():
form.save(commit=True)
return orders(request)
else:
print(form.errors)
else:
form = OrderForm()
context_dict = {'form':form}
return render(
request,
'purchaseorders/add_order.html',
context_dict
)
model.py
# Create your models here.
class Supplier(models.Model):
supplier_code = models.CharField(max_length=10)
supplier_name = models.CharField(
max_length=100,
unique=True
)
supplier_email = models.EmailField(max_length=100)
supplier_website = models.URLField(max_length=100)
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.supplier_name)
super(Supplier,self).save(*args, **kwargs)
def __unicode__(self):
return self.supplier_name
def __str__(self):
return self.supplier_name
class Meta:
verbose_name_plural = "Suppliers"
class Order(models.Model):
supplier = models.ForeignKey(Supplier)
po_number = models.IntegerField(default=0)
ordered_by = models.CharField(max_length=50)
order_date = models.DateTimeField()
supplier_name = models.CharField(max_length=50)
net_value = models.DecimalField(
decimal_places=2,
max_digits=10
)
class Meta:
verbose_name_plural = "Orders"
def __unicode__(self):
return self.po_number
forms.py
from django import forms
from PurchaseOrders.models import Supplier, Order
class SupplierForm(forms.ModelForm):
supplier_code = forms.CharField(
max_length=10,
help_text="Please enter a unique code"
)
supplier_name = forms.CharField(
max_length=100,
help_text="Please enter the Suppliers full name"
)
supplier_email = forms.EmailField(
max_length=100,
help_text="Please enter a email address"
)
supplier_website = forms.URLField(
max_length=100,
help_text="Please enter a website"
)
slug = forms.CharField(
widget=forms.HiddenInput(),
required=False
)
# an inline class to provide additional information on the form
class Meta:
# provide an association between the ModelForm and model
model = Supplier
fields = (
'supplier_code', 'supplier_name',
'supplier_email', 'supplier_website'
)
class OrderForm(forms.ModelForm):
#list all form details except the Foreignkey connection
po_number = forms.IntegerField(
help_text="please enter a PO Number"
)
ordered_by = forms.CharField(
max_length=50,
help_text="please enter your name"
)
order_date = forms.DateTimeField(
help_text="please enter a date of order"
)
#supplier_name = forms.ModelChoiceField(
queryset=Supplier.objects.all()
)
net_value = forms.DecimalField(
decimal_places=2,
max_digits=10,
help_text="please enter a net amount"
)
class Meta:
# provide an association between the ModelForm and model
model = Order
html
从问题开始,您可以在模型的保存方法中捕获此数据:
class Order(models.Model):
[...]
def save(self, *args, **kw):
if self.supplier_id is not None:
self.supplier_name = self.supplier.supplier_name
super(Order, self).save(*args, **kw)
然而,尽管在某些情况下上述内容可能是正确的,例如如果供应商名称预计会发生变化,但更典型的情况是通过现有关系访问相关字段,例如:
myorder.supplier.supplier_name
你为什么要这么做?这是不必要的重复数据。订单始终可以通过外键访问供应商名称,因此,保存该名称的单独副本是没有意义的。有效的一点是,我想我只是想了解如果我想这样做,我可以怎么做,然后就像你指出的那样,我意识到没有必要。我的另一个想法是,如果我使用供应商模型中的另一个字段,我如何根据该字段找到id,然后保存它,当我尝试这样做时,我会在foreignkey上得到完整性空约束错误,谢谢,我现在在模板中得到了myorder.supplier.supplier\u名称显示,我知道这是更好的答案。
myorder.supplier.supplier_name