Django: Некоторые пользователи получают случайную ошибку 404

#django #django-views #django-templates #django-urls

Вопрос:

Я столкнулся со странной проблемой, с которой не могу справиться самостоятельно.

В обычных случаях, когда пользователи нажимают на ссылку, их перенаправляют на страницу, где они могут редактировать свои приманки (объекты). Тем не менее, некоторые пользователи получают 404 ошибки, но я не знаю, почему, потому что страница отображается для большинства пользователей.

html, где ссылка находится

         <div class="row justify-content-center mx-2" >
            <div class="col-12 p-0">
                <ul class="list-group text-center custom-borders m-2 p-0">
                    {% if own_hookbaits.count == 0 %}
                    <a href="{% url 'user_profile:hookbaits' request.user.fisherman.fisherman_id %}" class="list-group-item" >No hook baits yet</a>        
                    {% else %}
                        {% for hookbait in own_hookbaits %}    
                        <a href="{% url 'user_profile:hookbaits' request.user.fisherman.fisherman_id %}" class="list-group-item">{{ hookbait.name }}</a>
                        {% endfor %}
                    {% endif %}
                </ul>
            </div>
 

views.py

 class HookBaitUpdateView(UpdateView):
    model = HookBait
    template_name = "user_profile/hookbaits.html"
    form_class = HookBaitForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['formset'] = HookBaitFormset(queryset=HookBait.objects.filter(fisherman=self.request.user.fisherman))
        return context

    def post(self, request, *args, **kwargs):
        formset = HookBaitFormset(request.POST)
        if formset.is_valid():
            return self.form_valid(formset)
        else:
            return self.form_invalid(formset)

    def form_valid(self, formset):
        instances = formset.save(commit=False)
        for instance in instances:
            instance.fisherman = self.request.user.fisherman
            instance.save()
        return super().form_valid(formset)

    def form_invalid(self, formset):
        return HttpResponse("Invalid")

    def get_success_url(self):
        return reverse('user_profile:profile', args=(self.kwargs['pk'],))
 

urls.py

 app_name = "user_profile"
urlpatterns = [
    path("profile/<int:pk>/", views.ProfileView.as_view(), name="profile"),
    path("profile/<int:pk>/hookbaits/", views.HookBaitUpdateView.as_view(), name="hookbaits"),
]
 

визуализированный html

 <div class="row justify-content-center m-0">
    <div class="col-12 col-md-6 col-lg-4 p-0">
        <div class="row mx-3 my-3 justify-content-center text-center">
            <div class="card p-2 custom-borders">
                <div class="card-body p-2">
                    <form method="POST">
                        {% csrf_token %}
                        <table class="d-flex justify-content-center">
                            {{ formset.management_form }}
                            {% for form in formset %}
                            <tr class="formset_row">
                                {% for field in form.visible_fields %}
                                <td class="pb-2">
                                    {% if form.instance.pk %}{{ form.DELETE }}{% endif %}
                                    
                                    {% if forloop.first %}
                                    {% for hidden in form.hidden_fields %}
                                        {{ hidden }}
                                    {% endfor %}
                                    {% endif %}
        
                                    {{ field.errors }}
                                    {{ field }}
                                </td>
                                {% endfor %}
                            </tr>
                            {% endfor %}
                        </table>
                        <input type="submit" class="btn btn-primary w-50 mt-1" style="background-color: #00754B;" value="Mentés">
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
 

Есть какие-нибудь предложения, каким было бы решение? Спасибо!

Ответ №1:

есть некоторые возможности

  1. неправильная ссылка нажата, например, если вы пытаетесь получить доступ к этому профилю URL/25/приманки для крючков/, а в индексе данных нет приманки для крючков с идентификатором 25
  2. в HookBaitUpdateView вы пытаетесь получить запрос queryset=HookBait.objects.filter(fisherman=self.request.user.fisherman). возможно, с пользователем не связана страница hookbait. fisherman 404, которая в основном обслуживается при вызове get_object_or_404(HookBait, pk=25), и представление обновления может вызвать этот метод

Комментарии:

1. В режиме обновления отображается страница, на которой пользователь может видеть свои собственные приманки для крючков. Страница также отображается без каких-либо проблем, когда еще нет приманки для крючка.