2012-03-14 5 views
0

Я получаю 403 запрещенную ошибку. я пробовал делать контекст thingie, который был объяснен на форуме, но я все еще на первом месте.Отсутствует или отсутствует идентификатор CRSF

Что я делаю неправильно? my views.py

def add_player(request, team_id): 
    template = get_template('cricket/addplayer.html') 
    loggedinuser = request.user 
    team = Team.objects.get(id=team_id) 
    if request.method== 'POST': 
     form = PlayerForm(request.POST) 
     if form.is_valid(): 
      player = Player.objects.create(
       name = form.cleaned_data['name'], 
       team = Team.objects.get(id=team_id), 
       role = form.cleaned_data['role'], 
       position = form.cleaned_data['position'] 
      ) 

      return HttpResponseRedirect('/team/%s/' % team_id) 
    else: 
     form = PlayerForm 

    page_vars = Context({ 
     'form': form, 
     'loggedinuser': loggedinuser, 
     'team': team, 
    }) 

    output = template.render(page_vars) 
    return HttpResponse(output) 

и мой шаблон. как вы можете видеть, он получил {% csrf_token%}

{% extends 'cricket/base.html' %} 
{% block title %} 
    {{ loggedinuser }} 
{% endblock %} 

{% block username %} 
    {{ loggedinuser }} 
{% endblock %} 

{% block date %} 
    {{ today }} 
{% endblock %} 

{% block content %} 
    <div class="span7"> 
     <h2>Adding player for {{ team }}</h2> 
     <form method="post" action="."> 
      {% csrf_token %} 
      {{ form.as_p }} 
      <input type="submit"> 
     </form> 
    </div> 
{% endblock %} 

я уверен, я бы взломать мою голову что-то довольно скоро.

// mouse

Okey Я решил это. вы должны использовать RequestContext. вот мое решение, изменить две последние строки в Orignal коды включить crsfcontext

page_vars = Context({ 
    'form': form, 
    'loggedinuser': loggedinuser, 
    'team': team, 
}) 

crsfcontext = RequestContext(request, page_vars) 

output = template.render(crsfcontext) 
return HttpResponse(output) 
+1

Привет, мы рады, что вы решили свою проблему. Вместо того, чтобы редактировать свой вопрос, чтобы включить ваше решение, лучше добавить его в качестве отдельного ответа. Таким образом, другие пользователи могут проголосовать за нее, и вы можете отметить ее как принятую, что позволяет другим пользователям видеть, что вы нашли ответ. – Alasdair

+2

Вы можете использовать [render] (https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render) для более чистого кода в представлении – ilvar

+0

, я не мог ответить на свой вопрос, пришлось ждать 8 часов. – debuggerpk

ответ

0

Вы можете также использовать на основе класса общего вида в Джанго. Может быть что-то подобное в вашем случае (я не проверял)

urls.py

urlpatterns = patterns('', 
    url(r'^your-url/(?P<teamId>\d+)/$', AddPlayerView.as_view(), name="add-player"), 
) 

views.py

from django.views.generic import FormView 
from django.core.urlresolvers import reverse 
..... 

class AddPlayerView(FormView): 

    template_name = 'cricket/addplayer.html' 
    form_class = PlayerForm 

    def form_valid(self, form): 
    """ Code if the form is valid """ 
       ... 
     player = Player.objects.create(
      name = form.cleaned_data['name'], 
      team = Team.objects.get(id=form.cleaned_data['team_id']), 
      role = form.cleaned_data['role'], 
      position = form.cleaned_data['position'] 
     ) 

     # You could use url reverse here 
     url = reverse('your-view-name', args=[form.cleaned_data['team_id']]) 
     return HttpResponseRedirect(url) 


    def form_invalid(self, form): 
    """ Code if the form is invalid """ 
     ..... 


    def get_context_data(self, **kwargs): 
     context = super(AddPlayerView, self).get_context_data(**kwargs) 
     loggedinuser = self.request.user 
     team = Team.objects.get(id=self.kwargs['teamId']) 
     context['loggedinuser'] = loggedinuser 
     context['team'] = team 
     return context 
0

Try функцию использовать render_to_response вместо HttpResponse с некоторыми RequestContext.

Смежные вопросы