man*_*sim 21 python django django-forms
我创建了一个模型Student,它从Django User扩展而来,是另一个模型的外键,而它有一个名为year的整数字段.我想要做的是保存一个有两个字段的表单.一个是课程ID,另一个是整数字段年份.当我点击提交时,我收到错误无法分配"u'2":"Student.course"必须是"课程"实例.
models.py
class Student(models.Model):
user = models.OneToOneField(User)
course = models.ForeignKey(Course)
year = models.IntegerField(validators=[MinValueValidator(1),
MaxValueValidator(7)])
Run Code Online (Sandbox Code Playgroud)
view.py
def step3(request):
user = request.user
if request.method == 'POST':
form = SelectCourseYear(request.POST)
if form.is_valid():
form.save()
return render_to_response("registration/complete.html", RequestContext(request))
else:
form = SelectCourseYear()
return render(request, 'registration/step3.html',)
Run Code Online (Sandbox Code Playgroud)
forms.py
class SelectCourseYear(forms.ModelForm):
course = forms.CharField()
year = forms.IntegerField(required=True)
class Meta:
model = Student
fields = ['user', 'course', 'year']
Run Code Online (Sandbox Code Playgroud)
Bib*_*ath 42
ModelForm如果您已在fields属性中提及它们,则无需重新定义字段.所以你的表格应该是这样的 -
class SelectCourseYear(forms.ModelForm):
class Meta:
model = Student
fields = ['course', 'year'] # removing user. we'll handle that in view
Run Code Online (Sandbox Code Playgroud)
我们可以在视图中轻松处理表单 -
def step3(request):
user = request.user
if request.method == 'POST':
form = SelectCourseYear(request.POST)
if form.is_valid():
student = form.save(commit=False)
# commit=False tells Django that "Don't send this to database yet.
# I have more things I want to do with it."
student.user = request.user # Set the user object here
student.save() # Now you can send it to DB
return render_to_response("registration/complete.html", RequestContext(request))
else:
form = SelectCourseYear()
return render(request, 'registration/step3.html',)
Run Code Online (Sandbox Code Playgroud)
course必须是 Course 模型的实例,而不仅仅是实例的主键。您仍然可以接受表单中的 id 作为文本输入,但您将需要检索实际的课程实例并分配值。
您需要验证课程 ID 是否有效,因此将该代码放入 clean 方法中并不是一个坏主意。还要注意course这里是如何排除该字段的?否则表单将期望它存在。您也不需要重新定义 year 字段,因为 ModelForm 将从 Student 模型继承该字段。
# forms.py
class SelectCourseYear(forms.ModelForm):
class Meta:
model = Student
exclude = ['user', 'course']
course_id = forms.IntegerField()
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(SelectCourseYear, self).__init__(*args, **kwargs)
def clean_course_id(self):
course_id = self.cleaned_data.get('course_id')
try:
self.course = Course.objects.get(pk=course_id)
except Course.DoesNotExist:
raise forms.ValidationError('Sorry, that course id is not valid.')
return course_id
def save(self, commit=True):
instance = super(SelectCourseYear, self).save(commit=False)
instance.course = self.course
instance.user = self.user
if commit:
instance.save()
return instance
# views.py
def step3(request):
if request.method == 'POST':
form = SelectCourseYear(request.POST or None, user=request.user)
if form.is_valid():
form.save()
return render_to_response("registration/complete.html",
RequestContext(request))
return render(request, 'registration/step3.html',)
Run Code Online (Sandbox Code Playgroud)
现在,当您调用.save()模型时,课程字段将被分配一个实例Course
| 归档时间: |
|
| 查看次数: |
39042 次 |
| 最近记录: |