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,........)
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