2013-09-27 131 views
0

我正在构建简单的课程管理应用程序。我希望用户注册课程。这里注册模式:Django表单:使用request.user和url参数预填充表单

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

不,我不想显示任何字段,只需输入发送request.user和course_id后的按钮。我正在使用基于功能的视图。 – Malyo

回答

0

你想隐藏的输入:

​​3210

我想通过在COURSE_ID作为上下文变量个人,而不是在GET:

<input type="hidden" name="course_id" value="{{course_id}}"/> 

或者你也可以从URL中获得的价值字符串使用{{request.get_full_path}}和一些切片。

+0

嗯,这不完全是我的问题。事情是我真的不需要任何输入字段,因为这两个值都出现在我的视图中,我只是不知道如何通过django形式助手和POST请求保存这些值 – Malyo

+0

这正是你如何做到 - 这些是隐藏的表单值 - 通过POST中的表单传递数据的唯一方法。 – professorDante

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()的方法是有道理的。我想我需要清理course.id以防万一,也许在保存之前进行验证?