Ошибка: у объекта «Ответить» нет атрибута «получить»? - PullRequest
0 голосов
/ 07 января 2020

Я использую Django 1.11. когда я использую этот код, он работает со мной, но когда я пытаюсь добавить новое условие, кроме того, в этом случае (иначе) я получаю эту ошибку:
image
Я хочу поставить новое условие, чтобы остановить кого-либо, может добавить (метод get) на мою страницу, как можно?

избранное. html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Favourite Page</title>
    <style>
        input {padding: 8px;margin-top: 5px}
        label {display: inline-block}
        .input {display: inline-block}

    </style>
</head>
<body>

    {% if form_data %}
        {{ form_data.question }}

    {% else %}
    <form action="{% url 'market:favourite' %}" method="post">
        {% csrf_token %}
        {% include 'market/template-form.html' %}
        <input type="submit">
    </form>
    {% endif %}



</body>
</html>

views.py

def favourite(request):
    context = {}
    form = Answer
    context['form'] = form
    if request.method == 'POST':
        form = form(request.POST)
        if form.is_valid:
            form.save(commit=False)
            return render(request, 'market/favourite.html', {'form_data': form.cleaned_data})
    else:
        form = Answer()
        return form
    return render(request, 'market/favourite.html', {'form': form})<br>

forms.py

from .models import Question
from django import forms


class Answer(forms.ModelForm):
    class Meta:
        model = Question
        fields = ['question']

models.py

CHOICE = [(1, 'Si'), (2, 'No')]

class Question(models.Model):
    question = models.IntegerField(choices=CHOICE, default=1, blank=False)

1 Ответ

1 голос
/ 07 января 2020

Основная проблема в том, что вы return form. Вы не можете вернуть форму как результат функции представления, это должен быть HttpResponse объект.

При этом ваш код содержит некоторые элементы, которые немного "проблематичны c":

  1. лучше называть ваши формы суффиксом Form, так как в противном случае вы можете сгенерировать "имя cla sh" с моделью с именем Answer;
  2. you передать ссылку на Answer контексту, а не объекту формы. Это полезно, если выясняется, что форма недействительна;
  3. , чтобы проверить правильность формы, вам необходимо позвонить is_valid() method [Django -doc] , не получить ссылку на метод, поскольку он всегда имеет правдивость True;
  4. , если форма верна, вы, вероятно, захотите commit результат, поскольку в противном случае ваша форма не будет использоваться;
  5. , если запрос POST действителен, вы обычно возвращаете перенаправление для реализации Post / Redirect / Get pattern [wiki] ;
  6. Вы ничего не делаете с вашим контекстом, так как вы просто создаете словарь и визуализируете его как контекст.

Лучшее представление будет выглядеть следующим образом:

from django.shortcuts import redirect

def favourite(request):
    if request.method == 'POST':
        # rename Answer to AnswerForm
        form = <b>AnswerForm(</b>request.POST<b>)</b>
        if form.<b>is_valid()</b>:  # call the method
            form.<b>save()</b>
            return <b>redirect(<i>'some-view-name'</i>)</b>
    else:
        form = <b>AnswerForm()</b>
    return render(request, 'market/favourite.html', {'form': form})

Здесь необходимо заменить 'some-view-name' на имя представления, на которое следует перенаправить в случае успешного просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...