2013-03-02 141 views
0

我使用django从头开始制作一个名为Startthedark的应用程序,并且遇到了一个错误。Django表单无法验证

我会尽我所能地澄清错误。对不起,如果我不能。

我的应用程序显示AA文本框要求的描述,当我提交一份说明它是想给我重定向到另一个页面,显示最新的说明,而不是把它重定向我到同一个页面..

enter image description here

现在我认为问题出在我的views.py上,因为数据无法使用,所以它只是让我回到同一页面。并且它没有提交到管理页面的事件模型中。

我views.py

from events.models import Event 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from events.forms import EventForm 
from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 


def tonight(request): 
    events = Event.objects.filter(latest=True) 
    return render_to_response('events/tonight.html',{'events':events},context_instance = RequestContext(request)) 


def create(request): 
    form = EventForm(request.POST or None) 
    if form.is_valid(): 
     event = form.save(commit=False) 
     event.creator = request.user 
     guessed_date = None 
     event.start_date = guessed_date 
     event.save() 
     request.user.message_set.create(message='Your event was posted') 
     if 'next' in request.POST: 
      next = request.POST['next'] 
     else: 
      next = reverse('ev_tonight') 
     return HttpResponRedirect(next) 
    return render_to_response(
     'events/create.html', 
     {'form':form}, 
     context_instance = RequestContext(request) 
    ) 

我forms.py

from django import forms 
from events.models import Event 
class EventForm(forms.ModelForm): 
    description = forms.CharField(max_length=340,widget=forms.Textarea) 

    class Meta: 
     model = Event 
     fields = ('description',) 

我URL.conf

from django.conf.urls.defaults import * 
from django.contrib import admin 
from events import views 
urlpatterns = patterns('events.views', 
     url(r'^tonight/$','tonight',name='ev_tonight'), 
     url(r'^create/$','create',name='ev_create'), 
) 

我的models.py

from django.db import models 
from datetime import datetime, timedelta 
from django.contrib.auth.models import User 
from django.db.models.query import QuerySet 


class Event(models.Model): 
    description = models.TextField() 
    creation_date = models.DateTimeField(default = datetime.now) 
    start_date = models.DateTimeField(null=True, blank= True) 
    creator = models.ForeignKey(User , related_name = 'event_creator_set') 
    attendees = models.ManyToManyField(User , through = "Attendance") 
    latest = models.BooleanField(default=True) 
    def __unicode__(self): 
     return self.description 
    def save(self, **kwargs): 
     now = datetime.now() 
     start = datetime.min.replace(year = now.year , month=now.month,day=now.day) 
     end = (start + timedelta(days=1)) - timedelta.resolution 
     Event.objects.filter(latest=True,  creator=self.creator).filter(creation_date__range=(start,end)).update(latest=False) 
     super(Event,self).save(**kwargs) 

class Attendance(models.Model): 
    user = models.ForeignKey(User) 
    event = models.ForeignKey(Event) 
    registration_date = models.DateTimeField(default=datetime.now) 

    def __unicode__(self): 
     return "%s is attending %s" %(self.user.username,self.event) 

我create.html上

{% extends "tin.html" %} 
    {% block title %}Create - {{ block.super }}{% endblock %} 
    {% block main_content %} 
      <form method = "POST' action""> 
       <ul> 
       {{ form.as_ul }} 
      </ul> 
      <input type = "submit" value="Create Event" /> 
     </form> 
    {% endblock %}     
+0

你能告诉我们什么'events/create.html'看起来像什么吗?接下来可能会在表单中设置。如果不是,那么它会使用'ev_tonight'的url – Ngenator 2013-03-02 05:40:11

+0

另外,你是我今天看到的第二个遇到问题的人,他正在做这个特定的教程。如果这个给你带来麻烦,Django有一个很好的初学者教程。 https://docs.djangoproject.com/en/1.5/intro/tutorial01/ – Ngenator 2013-03-02 05:43:33

+0

是的,我做了这个教程,我也发布了我的create.html。感谢帮助Ngentator – donkeyboy72 2013-03-02 06:01:26

回答

1

看起来你需要修复您的模板。表单标签似乎是错误的。您没有正确关闭方法属性,您使用了单引号而不是double。这就是您的表单通过表单数据发出GET请求的原因。

{% extends "tin.html" %} 
{% block title %}Create - {{ block.super }}{% endblock %} 
{% block main_content %} 
    <form method="POST" action""> 
     {% csrf_token %} 
     <ul> 
      {{ form.as_ul }} 
     </ul> 
     <input type = "submit" value="Create Event" /> 
    </form> 
{% endblock %} 
+0

好赶上,我没有看到:)也许我需要更加集中 – catherine 2013-03-02 06:05:07

+0

@ donkeyboy72所以你有csrf中间件启用。这意味着每个表单都必须包含一个csrf标记,或者该视图必须用'csrf_exempt'装饰。我会解决我的答案,包括令牌。 – Ngenator 2013-03-02 06:13:29

+0

好吧,我收到了此消息“'用户'对象没有属性'message_set'” – donkeyboy72 2013-03-02 06:14:00

1
if form.is_valid(): 
    ..... 

    return HttpResponseRedirect(reverse('events:ev_tonight')) 
+0

谢谢你cathy也帮助我。 – donkeyboy72 2013-03-02 06:32:47

+0

是啊我没看到你的模板代码。我刚刚读了你的看法。好的赶上由Ngenator – catherine 2013-03-02 06:35:07

+0

@catherine你可以请给我一些链接django注册应用程序定制我想添加一些额外的领域和社会登录 – masterofdestiny 2013-03-02 07:28:27