Django: перенаправление после публикации не работает - PullRequest
0 голосов
/ 27 января 2020

После создания moneylog я хочу вернуться к moneybook_detail, поэтому я сделал moneylog / view.py :

 class moneylog_create(CreateView):
    form_class = forms.CreateMoneylogForm
    template_name = "moneylogs/create.html"

    def form_valid(self, form):
        moneylog = form.save()
        moneybook = moneybook_models.Moneybook.objects.get(
            pk=self.kwargs["pk"])
        form.instance.moneybook = moneybook
        moneylog.save()
        form.save_m2m()
        return redirect(reverse("moneybooks:detail", kwargs={'pk': moneybook.pk}))

и это moneybook / urls. py

app_name = "moneybooks"

urlpatterns = [
    path("create/", views.moneybook_create.as_view(), name="create"),
    path("update/<int:pk>/",
         views.moneybook_update.as_view(), name="update"),
    path("<int:pk>/", views.moneybook_detail, name="detail")
]

moneylogs / urls.py

app_name = "moneylogs"

urlpatterns = [
    path("create/<int:pk>/", views.moneylog_create.as_view(), name="create"),
    path("update/<int:pk>/", views.moneylog_update.as_view(), name="update")
]

вот моя деталь. html

<a style="display:scroll;position:fixed;bottom:50px;right:30px;" href="{% url 'moneylogs:create' pk %}">
    <div class="rounded-full h-16 w-16 flex items-center justify-center bg-red-400 text-bold font-bold text-white">+</div>
</a> 

вот мои moneylogs / forms.py

class CreateMoneylogForm(forms.ModelForm):
    class Meta:
        model = models.Moneylog
        fields = (
            "pay_day",
            "payer",
            "dutch_payer",
            "price",
            "category",
            "memo",
        )
        widgets = {
            "payer": forms.RadioSelect(attrs={"style": "width: 100 %"}),
            "dutch_payer": forms.CheckboxSelectMultiple,
            "memo": forms.Textarea(attrs={"rows": 3})
        }

    def save(self, *args, **kwargs):
        moneylog = super().save(commit=False)
        return moneylog

и moneylog_form. html

<form method="POST" class="w-full" enctype="multipart/form-data">
    {% csrf_token %}

    {% if form.non_field_errors %}
        {% for error in form.non_field_errors %}
            <span class="text-red-700 font-medium text-sm">{{error}}</span> 
        {% endfor %}
    {% endif %}

        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.name.label}} 
                </div>
                <div class="w-3/4 border-b my-2 py-3">
                    {{form.name}}
                </div>
            </div>
            {% if form.name.errors %}
                {% for error in form.name.errors %}
                    <span class="text-red-700 font-medium text-sm">{{error}}</span> 
                {% endfor %}
            {% endif %}
        </div>


        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.companion.label}} 
                </div>
                <div class="w-3/4 flex inline border-b my-2 py-3">
                    <div class="w-3/4">
                        {{form.companion}}
                    </div>
                    <div class= "w-1/4 flex justify-center ">
                        <a href="{% url 'tempfriends:create' %}"><i class="fas fa-plus-circle"></i></a>
                    </div>
                </div>
            </div>
            {% if form.companion.errors %}
                {% for error in form.companion.errors %}
                    ><span class="text-red-700 font-medium text-sm">{{error}}</span>
                {% endfor %}
            {% endif %}
        </div>


        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.country.label}} 
                </div>
                <div class="w-3/4 border-b my-2 py-3">
                    {{form.country}}
                </div>
            </div>
            {% if form.country.errors %}
                {% for error in form.country.errors %}
                    <span class="text-red-700 font-medium text-sm">{{error}}</span> 
                {% endfor %}
            {% endif %}
        </div>


        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.location.label}} 
                </div>
                <div class="w-3/4 border-b my-2 py-3">
                    {{form.location}}
                </div>
            </div>
            {% if form.location.errors %}
                {% for error in form.location.errors %}
                    <span class="text-red-700 font-medium text-sm">{{error}}</span> 
                {% endfor %}
            {% endif %}
        </div>


        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.start_date.label}} 
                </div>
                <div class="w-3/4 border-b my-2 py-3">
                    {{form.start_date}}
                </div>
            </div>
            {% if form.start_date.errors %}
                {% for error in form.start_date.errors %}
                    <span class="text-red-700 font-medium text-sm">{{error}}</span> 
                {% endfor %}
            {% endif %}
        </div>


        <div class="input {% if field.errors %}has_error{% endif %}">
            <div class="flex">
                <div class="w-1/4">
                    {{form.end_date.label}} 
                </div>
                <div class="w-3/4 border-b my-2 py-3">
                    {{form.end_date}}
                </div>
            </div>
            {% if form.end_date.errors %}
                {% for error in form.end_date.errors %}
                    <span class="text-red-700 font-medium text-sm">{{error}}</span> 
                {% endfor %}
            {% endif %}
        </div>


    <button class="px-2 py-1 rounded bg-red-500 text-white">{{cta}}</button>
</form>

перенаправление страницы отсутствует. без движения, он печатает просто журнал

"POST / moneylogs / create / 1 / HTTP / 1.1" 200 5275

Как я могу вернуться к moneybook_detail после создания moneylog? ? почему мой редирект не работает?

Ответы [ 2 ]

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

У универсального c CreateView есть два возможных пути возврата при получении запроса POST:

  • form_valid(), который в вашем случае перенаправляет. Это HTTP-статус 302.
  • form_invalid(), который снова отображает шаблон с привязанной формой в своем контексте, чтобы отобразить ошибки. Это HTTP-статус 200.

Поскольку ваш запрос возвращает статус 200, мы можем заключить, что представление перешло к методу form_invalid(), что означает, что в вашей форме есть ошибки. Кажется, вы отображаете различные ошибки поля (хотя шаблон, который вы показываете, предназначен для неправильной формы, я предполагаю, что это ошибка копирования и вставки), но проще всего отладить это добавить {{ form.errors }} вверху вашего шаблона для отображения все ошибки . Или установите точку останова в вашем методе form_invalid() (переопределите его на return super().form_invalid(form)).

0 голосов
/ 27 января 2020

либо измените app_name, либо измените href на details.html. Потому что в одном месте вы упомянули moneylogs, а в другом месте вы упомянули moneybooks.

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