2
votes

Modèle d'URL de modification de Django Oscar

J'ai configuré un projet django-oscar et j'essaye de configurer les URL. Mon objectif est de changer / catalogue en / catalogue .

Selon la documentation, j'ai ajouté app.py dans monprojet / app.py

mon projet / app.py

from django.conf.urls import url, include
from django.contrib import admin
from . import views
from .app import application

urlpatterns = [
    url(r'^i18n/', include('django.conf.urls.i18n')),

    url(r'^admin/', admin.site.urls),

    url(r'', application.urls),

    url(r'^index/$',views.index, name = 'index'),
]

mon projet / urls. py

from django.conf.urls import url, include
from oscar import app


class MyShop(app.Shop):
    # Override get_urls method
    def get_urls(self):
        urlpatterns = [
            url(r'^catalog/', include(self.catalogue_app.urls)),
            # all the remaining URLs, removed for simplicity
            # ...
        ]
        return urlpatterns


application = MyShop()

Le serveur de projet s'exécute sans aucune erreur, mais quand j'essaye localhost: 8000 / catalog j'obtiens

NoReverseMatch at / catalog / 'customer' n'est pas un espace de noms enregistré.

Le résultat attendu est localhost: 8000 / catalog devrait renvoyer la page du catalogue.


2 commentaires

Remplacez-vous également les modèles et les paramètres? Les modèles par défaut oscar référenceront de nombreuses vues qui peuvent manquer dans vos url_patterns personnalisés. Voir par exemple github.com/django-oscar/django- oscar / blob / master / src / oscar /… pour de nombreux noms de vues qui devront être présents si vous ne personnalisez pas le template de base, la navigation dans le tableau de bord, la page d'accueil, l'url_connexion, etc ...


Je n'ai remplacé aucun modèle et je n'ai pas encore créé d'application. c'est juste une installation oscar par défaut. Le forking de l'application de catalogue est-il nécessaire lorsque je configure les URL de catalogue?


3 Réponses :


0
votes

Vous devez inclure les URL, pas les référencer directement.

url(r'', include('application.urls')),


1 commentaires

J'ai ajouté url (r '', include (application.urls)), mais le problème persiste. voici une erreur du journal du serveur "django.urls.exceptions.NoReverseMatch: 'customer' n'est pas un espace de noms enregistré"



4
votes

Vous pouvez essayer ceci

​​dans app.py

from myproject.app import application as shop

 url(r'', shop.urls),

Et dans votre urls.py vous pouvez simplement ajouter ceci

from django.conf.urls import url, include
from oscar import app

class MyShop(app.Shop):
    # Override get_urls method
    def get_urls(self):
        urls = [
            url(r'^catalog/', include(self.catalogue_app.urls)),
            # all the remaining URLs, removed for simplicity
            # ...
        ]
        urls = urls + super(MyShop,self).get_urls()
        return urls


application = MyShop()

J'espère que cela vous aidera


5 commentaires

j'obtiens cette erreur "UnboundLocalError: variable locale 'urls' référencée avant l'affectation" voulez-vous dire urls = url + super (MyShop, self) .get_urls ()?


Ça marche!!! Donc, fondamentalement, il me manquait le reste des URL dans app.py. Est-ce exact?


j'espère que cela vous aide,


J'ai marqué votre réponse comme acceptée, mais cela arrive - "Merci pour le commentaire! Les votes exprimés par ceux qui ont moins de 15 points de réputation sont enregistrés, mais ne modifiez pas le score affiché publiquement."


Ainsi, quand je change / catalog en / catalog l'URL / catalog fonctionne également toujours. Comment désactiver cela?



2
votes

Extension de la réponse de c.grey pour spécifier comment remplacer au lieu d'ajouter les URL -

from django.conf.urls import url, include
from oscar import app


class MyShop(app.Shop):
    def get_urls(self):
        urls = super(MyShop, self).get_urls()
        for index, u in enumerate(urls):
            if u.regex.pattern == r'^catalogue/':
                urls[index] = url(r'^catalog/', include(self.catalogue_app.urls))
                break
        return urls


application = MyShop()


7 commentaires

Que faire si je dois changer le modèle d'URL complexe comme checkout / shipping-address / en quelque chose comme checkout / billing-address /?


@abicrazieeee Alors pourquoi ne pas bifurquer l'application checkout et effectuer le changement dans urls.py ? Le faire comme ça (comme dans ma réponse) n'est pas vraiment recommandé pour les URL individuelles.


J'ai donc besoin de fourcher l'application de paiement, puis de créer un fichier urls.py et de réécrire le modèle d'URL pour le paiement / l'adresse de facturation /. Puis-je (inclure) les URL de paiement dans la racine urls.py? Pourriez-vous s'il vous plaît me montrer le code exact sur la façon dont cela est réalisé car je ne trouve pas urls.py du projet Oscar par défaut sur GitHub.


@abicrazieeee Fondamentalement, après avoir ouvert l'application de paiement, vous devez faire la même chose (comme indiqué dans la réponse) dans la classe CheckoutApplication de checkout / app.py . Modifiez les get_urls , mais avec la condition u.regex.pattern == r'shipping-address / $ ' & modification urls [index] = url (r' adresse-de-facturation / $ ', self.shipping_address_view.as_view (), name =' adresse-de-livraison ') . Vous n'avez rien d'autre à faire (aucune modification de urls.py nulle part).


Il dit AppRegistryNotReady ("Les applications ne sont pas encore chargées.")


de django.apps import AppConfig depuis l'application oscar import depuis django.conf.urls import url, incluez la classe CheckoutConfig (AppConfig): name = 'checkout' label = 'blackweb checkout' def get_urls (self): urls = super ( CheckoutConfig, self) .get_urls () pour index, u dans enumerate (urls): if u.regex.pattern == r'shipping-address / $ ': urls [index] = url (r'billing-address / $' , self.shipping_address_view.as_view (), name = 'shipping-address') interrompre les URL de retour


@abicrazieeee Dans ce cas, vous pouvez simplement copier le code source pour apps.py et collez-le dans votre application fourchue avec les modifications appropriées.