Django表单:使用request.user和url参数预填充表单

时间:2013-09-27 12:38:34

标签: django django-forms

我正在构建简单的课程管理应用程序。我希望用户注册课程。这是注册模式:

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参数。

2 个答案:

答案 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以防万一,也许在保存之前验证?