微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django:处理模板中的外键值

如何解决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 举报,一经查实,本站将立刻删除。