8
votes

Django Sitemap changer URL de base

J'utilise https: //docs.djangoproject .COM / EN / DEV / REF / REPR / SITEMS /? DE = OLDDOCS .

J'ai un site de plan généré depuis Api.Mydomain.me pour le domaine: Mydomain.com.

Puis-je, avec Django, spécifier une URL de base?

Maintenant avec emplacement () Méthode Retour:

API.MYDOMAIN.ME/PAGE/3123 à la place de Mydomain.com/page/3123

est-ce possible? Merci.


4 commentaires

Avez-vous django.contrib.sites actif? Si vous le faites, sitemaps prendra un site actif à partir de là.


Oui Ilvar, mais je ne veux pas que les sitemaps prennent le site de là. Je voudrais spécifier mon URL de base personnelle. Maintenant retour: API.MYDOMAINE.ME/PAGE/3232 (API.MYDOMAINES.ME IT Le site actif), mais que je veux, est le suivant: Mydomain.com/page/3213 Comprenez-vous?


Oui. Vous pouvez le monkey-patch Sites pour le faire renvoyer un faux site avec Domaine dont vous avez besoin.


ILVAR: Comment? Toute astuce? Exemples?


6 Réponses :


0
votes

Vous pouvez essayer quelque chose comme ça:

from django.contrib.sites.models import Site, SiteManager

def get_fake_site(self):
    return Site(domain='mydomain.com', name='mydomain.com')

SiteManager.add_to_class('get_current', get_fake_site)


2 commentaires

Petit problème: type objet 'Sitemanager' n'a aucun attribut 'add_to_class'


Ouais, c'est pour les modèles seulement. Quoi qu'il en soit, votre solution ci-dessous est beaucoup plus appropriée.



15
votes

résolu, j'ai redéfini mon propre get_urls. Il fonctionne:

class MySitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    location = ""

    def get_urls(self, site=None, **kwargs):
        site = Site(domain='mydomain.com', name='mydomain.com')
        return super(MySitemap, self).get_urls(site=site, **kwargs)

    def items(self):
        return MyObj.objects.all().order_by('pk')[:1000]

    def lastmod(self, obj):
        return obj.timestamp


2 commentaires

Fonctionne très bien. Je ne sais pas quelle version de Django utilise, mais si vous utilisez Django 1.5.1, cela ne fonctionnera que si vous ajoutez un argument "protocole" dans la fonction get_urls. Github.com/django/django/blob/ 1.5.1 / DJANGO / STATEUR / SITEMS / ...


@DDAMADRE: J'ai essayé mais faisant face à un problème "get_urls () a eu un argument de mots-clés inattendu" site "" pourriez-vous vous aider à aider pour la même chose? Merci à adv.



0
votes

Et si vous avez plusieurs classes Sitemaps, vous pouvez utiliser une approche de mixine.

Exemple de Django 1.5.1. P>

from sitemaps import MySitemap
from sitemaps import AnotherSitemap
from yourapp.views import SomeDetailMyObjView
admin.autodiscover()

sitemaps = {
    'mysitemap': MySitemap,
    'anothersitemap': AnotherSitemap,
}


urlpatterns = patterns('',
    # other urls...
    url(r'^accessing-myobj/(?P<myobj_slug>[-\w]+)$', SomeDetailMyObjView, name='url_for_access_myobj'),
    (r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)


0 commentaires

2
votes

Je ne savais pas utiliser code> site code> dans mon code à l'aide de réponses précédentes, donc j'ai utilisé ci-dessous le code:

class Site:
    domain = 'my_site.com'


class MySitemap(Sitemap):
    def get_urls(self, site=None, **kwargs):
        site = Site()
        return super(MySitemap, self).get_urls(site=site, **kwargs)


0 commentaires

0
votes

J'utilise un correctif en créant une étiquette de modèle personnalisée et utilisez cette fonction pour remplacer l'URL: https://www.fraydit.com/blogs/wagtail-sitemap-in -Docker /


1 commentaires

Veuillez fournir une explication détaillée à votre réponse afin que l'utilisateur suivant comprenne votre réponse mieux. En outre, fournissez une couverture de base du contenu de votre lien, au cas où elle cesse de fonctionner à l'avenir.



0
votes

À peu près toutes les réponses nécessiteux que vous utilisiez le site Site qui nécessite des migrations pour fonctionner et qu'il soit ajouté à installé_apps .

Dans mon instance, je n'ai besoin que de Afficher l'URL correcte parce que j'utilise docker et l'URL de base basée sur ma configuration Docker est .

avec tout ce que vous avez à faire est de définir un site personnalisé ( ) La classe comme je l'ai fait ci-dessous et que vous êtes prêt à partir. xxx

et voici très simple le sitetososhow Classe: < / p> xxx


0 commentaires