Принудительный URL, чтобы соответствовать представлению с re_path - PullRequest
0 голосов
/ 09 октября 2019

У меня есть вид, который должен вызываться при вводе:

1) stickersgallit.pe/ordenes/ingresos или
2) http://127.0.0.1:8000/ordenes/ingresos (локально).

Однако, это вводи активируем другое представление AddProduct, поскольку оно предполагает ordenes это c_slug и ingresos это product_slug, когда они не являются:

path('<slug:c_slug>/<slug:product_slug>', views.AddProduct, name='AddProduct'),

Вопросы:

a) Как заставить /ordenes/ingresos активировать мой класс OrdersListVieworder/views/class OrdersListView(ListView))?
b) Или Как я могу ограничить то, что просматривает URL. ADDProduct считает c_slug и product_slug?

ВАЖНО:

На уровне проекта urls.py, order.urls уже находится над shop.urls, но я продолжаю получать:

ValueErrorat / ordenes / ingresos Представление shop.views.AddProduct не возвращало объект HttpResponse. Вместо этого он возвратил None.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('ordenes/', include('order.urls')),
    path('', include('shop.urls')),
    path('carrito_de_compras/', include('cart.urls')),
    path('marketing/', include('marketing.urls')),
    path('registrarse/', views.signupView, name = 'signup'),
    path('ingresar/', views.signinView, name = 'signin'),
    path('salir/', views.signoutView, name = 'signout'),
    path('province/', views.get_province, name = 'province'),
]

Proyect urls.py:

from django.contrib import admin
from django.urls import path, include, re_path
from shop import views
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^/ordenes/', include('order.urls')),
    path('', include('shop.urls')),
    path('carrito_de_compras/', include('cart.urls')),
    path('marketing/', include('marketing.urls')),
    path('registrarse/', views.signupView, name = 'signup'),
    path('ingresar/', views.signinView, name = 'signin'),
    path('salir/', views.signoutView, name = 'signout'),
    path('province/', views.get_province, name = 'province')
]

URL магазина:

from django.contrib import admin
from django.urls import path, re_path

from . import views

app_name = 'shop'

urlpatterns = [
    path('admin', admin.site.urls),
    path('', views.allCat, name='allCat'),
    path('packs/', views.PacksPage, name='PacksPage'), #Todos los packs
    path('catalogo', views.CatalogoListView.as_view(), name='catalogo'), #Todos los productos unitarios
    path('muestras/', views.SamplePackPage, name='SamplePackPage'), #Todas las muestras
    path('province/', views.get_province, name='province'),
    path('district/', views.get_district, name='district'),
    path('quienes-somos/', views.quienes_somos, name='quienes_somos'),
    path('como-comprar/', views.como_comprar, name='como_comprar'),
    path('contactanos/', views.contactanos, name='contactanos'),
    path('preguntas-frecuentes/', views.preguntas_frecuentes, name='preguntas_frecuentes'),
    path('legales/privacidad', views.legales_privacidad, name='legales_privacidad'),
    path('legales/terminos', views.legales_terminos, name='legales_terminos'),
    path('muestras/<slug:sample_slug>/medida-y-cantidad', views.StepOneView_Sample.as_view(), name='SampleDetail'),
    path('muestras/<slug:sample_slug>/subir-arte', views.StepTwoView_Sample.as_view(), name='UploadArt'),
    path('<slug:c_slug>/<slug:product_slug>/medida-y-cantidad', views.StepOneView.as_view(), name='ProdDetail'),
    path('<slug:c_slug>/<slug:product_slug>/subir-arte', views.StepTwoView.as_view(), name='UploadArt'),
    path('<slug:c_slug>/<slug:product_slug>', views.AddProduct, name='AddProduct'),
    path('stickers-por-unidad/', views.AddUnitaryProduct, name='AddUnitaryProduct'),
    path('<slug:c_slug>', views.ProdCatDetail, name='ProdCatDetail'),
    path('make_review/', views.make_review_view, name='make_review_view'),
    path('prices/', views.prices, name='prices'),
    path('email_confirmation_needed/', views.email_confirmation_needed, name='email_confirmation_needed'),
    re_path(r'^confirmacion-de-correo-electronico/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        views.activate, name='activate')
]

Заказ URL:

из пути импорта django.urls из. импорт представлений

app_name = 'order'

urlpatterns = [
    # path('thanks/<int:order_id>/', views.thanks, name = 'thanks'),
    path('/gracias_pago_con_tarjeta_de_credito/', views.thanks_credit_card, name='thanks_credit_card'),
    path('/gracias_pago_con_deposito_en_efectivo/', views.thanks_deposit_payment, name='thanks_deposit_payment'),
    path('/historial_de_compras/', views.orderHistory, name = 'order_history'),
    path('/<int:order_id>/', views.viewOrder, name = 'order_detail'),
    path('/ingresos/', views.OrdersListView.as_view(), name='ingresos'), #Todas las órdenes con filtro
]

Ответы [ 2 ]

1 голос
/ 09 октября 2019

a) Django будет разрешать URL-адреса в том порядке, в котором они представлены в ваших файлах urls.py, поэтому я предполагаю, что ваш /ordenes/ URL указан ниже, самый простой способ - поместить все /ordenes/ urls * 1003. * до AddProduct, поэтому, когда URL не совпадает с /ordenes/ingresos/, он будет продолжаться вниз по массиву до совпадения с AddProduct

b) Вы можете ограничить представление AddProductтаким же образом вы ограничиваете представление /confirmacion-de-correo-electronico/, используя re_path вместо path и определяя регулярное выражение, представляющее ваши слагы. Может быть, все они строчные, а может и не содержат определенных символов.

0 голосов
/ 09 октября 2019

Добавляя к ответу @PabloAlbonrnoz, я думаю, что ваши определения URL неверны, вам нужно изменить это так:

# in root url
path('ordenes/', include('order.urls')),

# in order url

urlpatterns = [
    # path('thanks/<int:order_id>/', views.thanks, name = 'thanks'),
    path('gracias_pago_con_tarjeta_de_credito/', views.thanks_credit_card, name='thanks_credit_card'),
    path('gracias_pago_con_deposito_en_efectivo/', views.thanks_deposit_payment, name='thanks_deposit_payment'),
    path('historial_de_compras/', views.orderHistory, name = 'order_history'),
    path('<int:order_id>/', views.viewOrder, name = 'order_detail'),
    path('ingresos', views.OrdersListView.as_view(), name='ingresos'),
]

В основном я удалил /, который был в начале определений URL.

Возможно, я не согласен с разделом b ответа Пабло. Я бы сказал, чтобы справиться с этим в виде или форме. Например:

from django.http import Http404

class AddProduct(CreateView):
     def post(self, request, *args, **kwargs);
        slug = request.kwargs.get('c_slug')
        if not slug in ['paper',  "vinyl", "laminated"]:
             return Http404('option not found')
        return super().post(request, *args, **kwargs)

Или, если вы не хотите, чтобы это было так, тогда вы можете следовать предложению Пабло, тогда URL будет:

re_path(r'^(paper|vinyl|laminated)/(?P<product_slug>[\w-]+)$', views.AddProduct, name='AddProduct')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...