好的 - 我很肯定我的问题是我对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">×</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
命令,但我真的不能很好地处理这个过程。谢谢你的帮助!
答案 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消息框架并向上下文添加一条消息,说明表单已成功提交并在重新加载的页面中显示消息(在使用消息时,您应该始终检查是否有消息要显示框架,所以这不会打破你第一次加载页面的情况)