今天的Django教训汇总:处理forms中外键数据的POST问题-20210401

1. 如何处理外键数据的POST问题:

1.1常见报错:

Cannot assign “A1”: “B1” must be a “C1” instance.
告诉我们 必须使用 C1 模型类的 实例,而不是具体的参数值。

这个错误信息,是我写入数据库时,表中使用了外键造成的

如果外键用fid表示,关联 用户表  User的话

写入数据库时  MM.objects.create(fid=1,........)就会报错

改成以下这个

A = User.objects.get(id=1)

MM.objects.create(fid=A,........)

https://tenten.blog.csdn.net/article/details/81772343?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control&dist_request_id=1328761.11127.16172483375778923&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-8.control

1.2 我的例子:

#views.py


# 建立表单页for Employee_Subject_form
def Employee_Subject_form(request):
    if request.method == 'POST' and request.POST:
        form = EmployeeSubjectForm(data=request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            employee = form.cleaned_data['employee']
            # 实例化对象
            subject_instance = Subject.objects.get(Subject_id=subject)
            employee_instance = Employee.objects.get(name=employee)
            # 表中添加数据
            Employee_Subject.objects.create(subject=subject_instance,employee=employee_instance)
            return HttpResponseRedirect('/admin/')
        else:
            form = EmployeeSubjectForm()
    else:
        form = EmployeeSubjectForm()
    return render(request, 'myclass/Subject_form.html',context={'form':form})

#forms.py

class EmployeeSubjectForm(forms.Form):
    subject = forms.CharField()
    employee = forms.CharField()

#跑成功
在这里插入图片描述
在这里插入图片描述

2.表单用选择项

https://blog.csdn.net/qq_37177115/article/details/114028687

# 单选的radio框
    gender = forms.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )
    # 单选select
    hobby = forms.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )
    # 多选的select框
    hobby1 = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )
    # 单选的checkbox
    keep = forms.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )
    # 多选的checkbox
    hobby2 = forms.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )
    
    phone = forms.CharField(
        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )

3.修改models的字段unique = True会出席失败时,可考虑将数据删除再添加。

4.1 forms中添加自动选择项。

#forms.py

#class EmployeeSubjectForm(forms.Form):
    #subject = forms.CharField(label="课程编码",)
    #employee = forms.CharField(label='姓名',)

class EmployeeSubjectForm(forms.Form):
    subject = forms.ModelChoiceField(label=r'课程编码',queryset=Subject.objects.all())
    employee = forms.ModelChoiceField(label=r'姓名',queryset=Employee.objects.all())

在这里插入图片描述

4.2 forms中添加自动选择项后,遇到的bug及解法。

  • #留意views.py中的subject_instance = Subject.objects.get(Subject_id=subject)

# 建立表单页for Employee_Subject_form
def Employee_Subject_form(request):
    if request.method == 'POST' and request.POST:
        form = EmployeeSubjectForm(data=request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            subject1 = subject
            employee = form.cleaned_data['employee']
            # 实例化对象
            subject_instance = Subject.objects.get(Subject_id=subject)
            employee_instance = Employee.objects.get(name=employee)
            # 表中添加数据
            Employee_Subject.objects.create(subject=subject_instance,employee=employee_instance)
            return HttpResponseRedirect('/admin/')
        else:
            form = EmployeeSubjectForm()
    else:
        form = EmployeeSubjectForm()
    return render(request, 'myclass/Employee_Subject_form.html',context={'form':form})
解法1- 同步修改models.py中的 __ str__(self)方法。如果不返回Subject_id,就无法提交数据。

#models.py

class Subject(models.Model):
    Subject_id = models.CharField(max_length=200,default='1',unique=True)
    subject_name = models.CharField(max_length=200)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE,null=True)
    employee = models.ManyToManyField(Employee, through='Employee_Subject')

    def __str__(self):
        #return '%s.%s' % (self.Subject_id, self.subject_name)
        return self.Subject_id

在这里插入图片描述

解法2:

#models.py

class Subject(models.Model):
    Subject_id = models.CharField(max_length=200,default='1',unique=True)
    subject_name = models.CharField(max_length=200)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE,null=True)
    employee = models.ManyToManyField(Employee, through='Employee_Subject')

    def __str__(self):
        #return '%s.%s' % (self.Subject_id, self.subject_name)
        return self.Subject_id

然后将Subject_id命名为FIN-0004.财务系统介绍,将原来的id和name合二为一。
在这里插入图片描述

6.在models增加唯一性限制。

#models.py

class Employee_Subject(models.Model):
    esid = models.AutoField(primary_key=True,max_length=200)
    subject = models.ForeignKey(Subject,on_delete=models.CASCADE)
    employee = models.ForeignKey(Employee,on_delete=models.CASCADE)
    
    def __str__(self):
        return '%s : %s' % (self.subject.subject_name, self.employee.name)

    #增加唯一性限制
    class Meta:
        unique_together = (("subject", "employee"),)

https://www.cnblogs.com/ccorz/p/Django-models-zhong-demeta-xuan-xiang.html
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值