如何解决Django:处理模板中的外键值
我最近开始使用 Django,但我正在努力以单一形式使用 2 个模型。我在 stackoverflow 中查看了很多问题,但找不到任何可以回答这个问题的问题。
我有 2 个模型 - 学生和地址
这是我的models.py
class Students (models.Model):
Student_Name = models.CharField(max_length=50,db_column='Student_Name')
College_Number = models.CharField(
max_length=10,db_column='College_Number')
Gender = models.CharField(max_length=50,db_column='Gender')
Blood_Group = models.CharField(max_length=50,db_column='Blood_Group')
Set = models.CharField(max_length=50,db_column='Set')
Standard = models.CharField(max_length=50,db_column='Standard')
class Addresses (models.Model):
Student_ID = models.ForeignKey(
Students,on_delete=models.CASCADE,db_column='Student_ID')
City = models.CharField(max_length=50,db_column='City')
State = models.CharField(max_length=50,db_column='State')
Pincode = models.CharField(max_length=50,db_column='Pincode')
AddressLine1 = models.CharField(max_length=1024,db_column='AddressLine1')
AddressLine2 = models.CharField(max_length=1024,db_column='AddressLine2')
这是我的views.py
def student_create_view(request):
student_form = StudentFrom(request.POST or None)
address_form = AddressForm(request.POST or None)
if (request.POST.get('Student_Name')
and request.POST.get('College_Number')
and request.POST.get('Gender')
and request.POST.get('Blood_Group')
and request.POST.get('Set')
and request.POST.get('Standard')
and request.POST.get('AddressLine1')
and request.POST.get('AddressLine2')
and request.POST.get('City')
and request.POST.get('State')
and request.POST.get('Pincode')
and student_form.is_valid()
and address_form.is_valid()):
# Fetch values from the Student Form
student_form.name = request.POST.get('Student_Name')
student_form.collegenumber = request.POST.get('College_Number')
student_form.Gender = request.POST.get('Gender')
student_form.Blood_Group = request.POST.get('Blood_Group')
student_form.Set = request.POST.get('Set')
student_form.Standard = request.POST.get('Standard')
# Fetch values from the Address Form
address_form.AddressLine1 = request.POST.get('AddressLine1')
address_form.AddressLine2 = request.POST.get('AddressLine2')
address_form.City = request.POST.get('City')
address_form.State = request.POST.get('State')
address_form.Pincode = request.POST.get('Pincode')
student_form.save()
address_form.save()
return redirect('/create')
else:
print(student_form.errors,address_form.errors)
messages.error(request,student_form.errors)
context = {
'student_form': student_form,'address_form': address_form
}
return render(request,"students/student_create.html",context)
这是我的forms.py
from django import forms
from .models import Students,Addresses
SET_CHOICES = (
('Bikrams','Bikrams'),('Ranas','Ranas'),('Aryans','Aryans'),('Rajputs','Rajputs')
)
GENDER_CHOICES = (
('Male','Male'),('Female','Female')
)
BLOODGROUP_CHOICES = (
('A-Positive','A-Positive'),('AB-Positive','AB-Positive'),('B-Positive','B-Positive'),('O-Positive','O-Positive'),('A-Negative','A-Negative'),('AB-Negative','AB-Negative'),('B-Negative','B-Negative'),('O-Negative','O-Negative')
)
STANDARD_CHOICES = (
('Nursery','Nursery'),('KG1','KG1'),('KG2','KG2'),('Class1','Class1'),('Class2','Class2'),('Class3','Class3'),('Class4','Class4'),('Class5','Class5'),('Class6','Class6'),('Class7','Class7'),('Class8','Class8'),('Class9','Class9'),('Class10','Class10'),('Class11','Class11'),('Class12','Class12')
)
class StudentFrom(forms.ModelForm):
Set = forms.ChoiceField(choices=SET_CHOICES,widget=forms.RadioSelect(attrs={'class': 'ml-2'}))
Gender = forms.ChoiceField(
choices=GENDER_CHOICES,widget=forms.RadioSelect(attrs={'class': 'ml-2'}))
Blood_Group = forms.ChoiceField(choices=BLOODGROUP_CHOICES)
Standard = forms.ChoiceField(choices=STANDARD_CHOICES)
class Meta:
model = Students
fields = ['Student_Name','College_Number','Gender','Blood_Group','Set','Standard']
class AddressForm(forms.ModelForm):
AddressLine1 = forms.CharField(label='Address Line 1',widget=forms.Textarea(
attrs={'rows': '1','cols': '35'}))
AddressLine2 = forms.CharField(label='Address Line 2','cols': '35'}))
class Meta:
model = Addresses
fields = ['AddressLine1','AddressLine2','City','State','Pincode']
我能够成功地将其迁移到 MysqL db,并且我可以在 Django admin 中看到外键关系(1 Student 可以有多个 Address)。但是,我正在尝试使用单个表单填充这两个模型,但我无法做到这一点,因为我不确定如何在地址中设置外键值 (Student_ID)。
正在寻找一种解决方案,我可以使用 Student 中的主键值填充 *Addresses 中的 Student_ID 外键字段(即Django 创建的默认主键)模型。
有没有办法自动做到这一点,这样我就不必在模板中处理这个问题?
解决方法
您可以获取student_form.save()
的结果并将其分配给Student_ID
包裹的.instance
的{{1}}:
address_form
通常 def student_create_view(request):
if request.method == 'POST':
student_form = StudentFrom(request.POST)
address_form = AddressForm(request.POST)
if student_form.is_valid() and address_form.is_valid():
# Fetch values from the Student Form
student = student_form.save()
address_form.instance.Student_ID = student
address_form.save()
return redirect('/create')
else:
print(student_form.errors,address_form.errors)
messages.error(request,student_form.errors)
else:
student_form = StudentFrom()
address_form = AddressForm()
context = {
'student_form': student_form,'address_form': address_form
}
return render(request,"students/student_create.html",context)
不会不以 ForeignKey
结尾,因此您可能希望将该字段重命名为 _ID
(字段名称写在 {{1} }} 而不是 ),因此将其写为:student
snake_case
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。