无法让modang中的Django ModelForm工作

时间:2016-08-09 15:34:38

标签: django twitter-bootstrap django-forms modal-dialog

好的 - 我很肯定我的问题是我对Django中的表单工作有一些基本的了解,所以除了代码修复之外,还欢迎30,000英尺的概念解释!

我试图从(大部分)单个视图(和单个模板)运行我的网站,使用模式弹出窗口查看信息(工作)以及编辑或添加它(不工作)。我可以看到表单,填写表单,然后单击“提交”,此时模式将关闭,但管理视图中不会显示任何新课程。

我将此限制在一个模型 - 我最简单的 - 暂时:

models.py:

class Course(models.Model):
    Name = models.CharField(max_length=30,unique=True)
    Active = models.BooleanField(default=True)

    def __unicode__(self):
        return u'%s' % (self.Name)

views.py

def IndexView(request,Course_id,Section_id):
    template_name = 'gbook/index.html'
    print Course_id,Section_id
    this_course = Course.objects.get(pk=Course_id)
    active_courses = Course.objects.all().filter(Active=True).exclude(pk=Course_id)
    section_list = Section.objects.all().filter(course=this_course)
    if len(section_list) >1:
        multi_section = True
    else:
        multi_section = False
    active_section = Section.objects.get(pk=Section_id)
    roster = Student.objects.all().filter(sections__in=[active_section])
    announcement_list = Announcement.objects.all().filter(sections__in=[active_section])
    courseaddform = CourseAddForm()

    context = {'active_courses':active_courses, 'this_course': this_course,
               'active_section':active_section, 'section_list':section_list,
               'roster':roster, 'multi_section':multi_section,
               'announcement_list':announcement_list, 'courseaddform':courseaddform}
    return render(request,'gbook/index.html', context)

forms.py

class CourseAddForm(forms.ModelForm):
    class Meta:
        model = Course
        fields = ['Name', 'Active']

模板/ index.html中

...
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span><span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a data-toggle="modal" data-target="#SectionRosterModal">Roster</a></li>
            <li><a data-toggle="modal" data-target="#AnnouncementModal">Announcements</a></li>
            <li><a data-toggle="modal" data-target="#CourseAddModal">CourseAdd</a></li>

          </ul>
        </li>
...
<!-- COURSE ADD MODAL -->
<div class="modal fade" id="CourseAddModal" role="dialog">
<div class="modal-dialog">

  <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header" style="padding:5px 10px;">
      <button type="button" class="close" data-dismiss="modal">&times;</button>
      <h4>Add Course</h4>
    </div>
    <div class="modal-body" style="padding:10px 10px;">
      <form data-parsley-validate method="post" id="courseaddform" action="" enctype="multipart/form-data"
                data-parsley-trigger="focusout">

        {% csrf_token %}

        {{ courseaddform.as_p }}

        <p id="login-error"></p>

        <input type="submit" class="btn btn-info submit" name="AddCourse" value="Add Course" />
      </form>
    </div>
    <div class="modal-footer">
    </div>
  </div>

</div>
</div>
...

我认为那里应该是POST命令,但我真的不能很好地处理这个过程。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

当您回发时看起来您没有对表单数据做任何事情,如果请求方法是POST,您需要处理表单

def IndexView(request, ...):
    if request.method == "GET":
        ... do what you are doing now and return
    elif request.method == "POST":
         cf = CourseAddForm(request.POST)
         if cf.is_valid():
             ...do stuff with cf.cleaned_data <---- this is a dict
             return ....

您现在正在为GET和POST请求做同样的事情,并且都没有处理提交的表单

请点击此处了解更多详情

https://docs.djangoproject.com/en/1.10/topics/forms/#the-view

编辑#1:

POST应该是返回同一URL的标准HTTP POST请求。只需像现在一样设置method标记,然后action="."(或模板中的URL查找)。

您需要返回有效的HTTPResponse对象,但处理表单时的正常情况是,如果表单有效,则返回HTTPResponseRedirect(...some url...)。对于单页面应用,如果您重新加载同一页面,则需要执行request.method == "GET"中所做的所有操作,因此可能会将HTTPResponseRedirect返回到相同的网址。在这种情况下,我会查看django消息框架并向上下文添加一条消息,说明表单已成功提交并在重新加载的页面中显示消息(在使用消息时,您应该始终检查是否有消息要显示框架,所以这不会打破你第一次加载页面的情况)

https://docs.djangoproject.com/en/1.9/ref/contrib/messages/