我正在构建简单的课程管理应用程序。我希望用户注册课程。这是注册模式:
class CourseMembers(models.Model):
student = models.ForeignKey(Student)
course = models.ForeignKey(Course)
def __unicode__(self):
return unicode(self.student)
学生模型已扩展用户模型 - 我想用request.user填写表单。
在课程模型中,最重要的是course_id,我通过URL参数(例如http://127.0.0.1:8000/courses/course/1/
)进入视图。
我想要实现的目标是产生“隐形”' (因此用户无法更改插入的数据)表单只包含输入,但包含request.user和course_id参数。
答案 0 :(得分:0)
您想要隐藏的输入:
<input type="hidden" name="user" value="{{request.user}}"/>
我会将course_id作为上下文变量亲自传递,而不是在GET中传递:
<input type="hidden" name="course_id" value="{{course_id}}"/>
或者你可以使用{{request.get_full_path}}和一些切片从url字符串中获取值。
答案 1 :(得分:0)
我找到了回答我自己的问题。所以这是一步一步: 首先,我们需要删除ModelForm中的所有字段:
class AddCourseMemberForm(forms.ModelForm):
class Meta:
model = CourseMembers
fields = {}
由于我们没有想要通过用户输入获取数据,我们只发送空POST请求,然后将数据直接插入到表单模型中,然后保存:
if request.method == 'POST':
form = AddCourseMemberForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.student_id = user.id #from request.user
form.course_id = course.id #from url parameter i.e courses/course/1/
form.save()
return redirect('index')
当我还在学习时,我需要知道这是否是安全的做事方式,以及is_valid method()是否有意义。我想我需要清理course.id以防万一,也许在保存之前验证?