2016-01-13 1 views
0

Привет и благодарю вас за ваш ответ.Как обращаться с защитой csrf в представлениях Django?

1) У меня есть модель с текстом и цифры

class Mention(models.Model): 
    mentionn = models.ForeignKey(Step, on_delete=models.CASCADE) 
    mention_text = models.TextField() 
    mention_digit = models.IntegerField() 

2), выполненный на заказ из (не в Джанго, так что без ModelForm и так далее), которые обращаются с просьбой текст и цифра

<form action="/addcomment{{ stepid }}" method="post"> 
{% csrf_token %} 
<label> 
Your text 
<textarea name = "mention_text" class="text-area-width" placeholder="You rваш отзыв"></textarea> 
</label> 
    <label>How much stars? 
     <select name="mention_digit"> 
      <option value="5">5 star</option> 
      <option value="4">4 star</option> 
      <option value="3">3 star</option> 
      <option value="2">2 star</option> 
      <option value="1">1 star</option> 
     </select> 
     </label> 
    <input type="submit" class="success expanded button" value="publish"/> 
</form> 

3) Далее я сделал вид, что genetate его:

def addcomment(request, step_id): 
    done = csrf(request) 
    if request.POST: 
     mentionn = Step(id=step_id) 
     mention_text = request.POST.get('mention_text', '') 
     mention_digit = request.POST.get('mention_digit', '') 
     mentionn_obj = Mention(mentionn=mentionn, mention_text=mention_text, mention_digit=mention_digit) 
     mentionn_obj.save()   
    return redirect('/step'+ step_id, done) 

И возникает проблема, что csrf_token отсутствует или неверен. Если я устанавливаю декоратор @csrf_exempt на мой взгляд, eveything работает (но защита отключена).

Так что моя задача - заставить его работать. Я не хочу использовать формы джанго, так как это довольно сложно сделать и выглядеть красиво.


Глобальная модель для веб-страницы:

class Step(models.Model): 
    title = models.CharField(max_length=200) 
    description = models.CharField(max_length=200) 
    annotation = models.TextField() 
    main_text = models.TextField() 
    main_photo = models.ImageField(upload_to='', height_field=None, width_field=None, max_length=100) 
    true_question = models.TextField() 
    true_answer = models.TextField() 
    true_link = models.CharField(max_length=200, default="http://lieman.ru/exshelp/") 

View, которые генерируют все страницы:

def step(request, step_id): 
    stepfields = get_object_or_404(Step, id = step_id) 
    navigators = Navigation_bar.objects.filter(navigatorr_id = step_id) 
    mentionship = Mention.objects.filter(mentionn_id = step_id) 
    username = auth.get_user(request).username 
    stepid = step_id 
    context = { 
     "stepfieldst" : stepfields, 
     "navigators" : navigators, 
     "mentionship" : mentionship, 
     "stepid" : stepid, 
     "username" : username, 
    } 
    return render_to_response('bakot/step.html', context) 
+0

Можете ли вы добавить трассировку ошибки и ваш 'views.py'? –

+0

Что делает функция 'csrf' в вашем представлении? – GwynBleidD

ответ

0

Для enable CSRF protection, Вам необходимо включить запрос каждый раз, когда вы предоставляете шаблон, использует тег {% csrf_token %}.

На данный момент вы не делаете этого для своего step. Самый простой способ сделать это - использовать render вместо render_to_response.

return render(request, 'bakot/step.html', context) 

Это не ясно, что имеется в виду make = csrf(request) делать в add_comment зрения, но я не думаю, что это необходимо.

+0

Я обновил свой вопрос. Это все файлы, которые я использую, чтобы моя форма работала. –

+0

Какой вид отображает шаблон, который отображает форму? Это не может быть представление 'add_comment', потому что все, что делает, перенаправляет пользователя. – Alasdair

+0

Добавить информацию о глобальной модели и ее представлении, которые генерируют всю страницу. –