2016-06-01 3 views
1

Im Versuch, die Detailseite eines Foto Instanz zugreifen, aber ich kann nicht scheinen, um zu arbeiten. (In der Kategorie Detailseite funktioniert super!)anzeigen Detailseite für das Modell mit django-MPTT-Urls

I http//domain.com/main-category/sub-cat/sub-sub-cat/photo-slug/

Models.py zugreifen möchten:

from mptt.models import MPTTModel, TreeForeignKey 


class Category(MPTTModel): 
    name = models.CharField('category name', max_length=32) 
    parent = TreeForeignKey('self', null=True, blank=True, verbose_name='parent category', related_name='categories') 
    slug = models.SlugField(unique=True) 

    def get_absolute_url(self): 
     return reverse('gallery', kwargs={'path': self.get_path()}) 


class Photo(models.Model): 
    name = models.CharField('photo name', max_length=32) 
    parent = TreeForeignKey(Category, verbose_name='parent category', related_name='photos') 
    slug = models.SlugField() 

    class Meta: 
     unique_together = ('slug', 'parent') 

urls.py:

url(r'^(?P<path>.*)', mptt_urls.view(model='gallery.models.Category', view='gallery.views.category', slug_field='slug'), name='gallery'), 

views.py:

def category(request, path, instance): 
    return render(
     request, 
     'gallery/category.html', 
     { 
      'instance': instance, 
      'children': instance.get_children() if instance else Category.objects.root_nodes(), 
     } 
    ) 

Wie ist es möglich, mit mtpp-urls auf das Fotomodell zuzugreifen?

Edit 1:

Sorry, wenn ich versuche, eine URL wie http//domain.com/main-category/sub-cat/sub-sub-cat/photo-slug Die Vorlage die Gallery main page angezeigt werden, da es keine instance ist, wenn ich die URL mit dem Foto-Slug versuchen (und ja, hat das Foto, um die Kategorie wie ein Elternteil :)

Hier ist die category.html Vorlage:

<html> 
    <head> 
     <title>{% if instance %}{{ instance.name }}{% else %}Gallery main page{% endif %}</title> 
    </head> 
    <body> 
     <h3>{% if instance %}{{ instance.name }}{% else %}Gallery main page{% endif %}</h3> 

     <a href="{% url 'gallery' path='' %}">Gallery main page</a> 
     {% for ancestor in instance.get_ancestors %} 
      > <a href="{{ ancestor.get_absolute_url }}">{{ ancestor.name }}</a> 
     {% endfor %} 
     > <strong>{{ instance.name }}</strong> 

     <h4>Subcategories:</h4> 
     <ul> 
      {% for child in children %} 
       <li><a href="{{ child.get_absolute_url }}">{{ child.name }}</a></li> 
      {% empty %} 
       <li>No items</li> 
      {% endfor %} 
     </ul> 

     <h4>Photos:</h4> 
     <ul> 
      {% for object in instance.photos.all %} 
       <li><a href="{{ object.slug }}">{{ object.name }}</a></li> 
      {% empty %} 
       <li>No items</li> 
      {% endfor %} 
     </ul>   

    </body> 
</html> 
+0

Hallo, wenn Sie sagen, Sie können es nicht zur Arbeit bekommen, erhalten Sie irgendeine Fehlermeldung? Wenn ja, kannst du uns was sagen? – raphv

+0

Vielen Dank für den Kommentar, aktualisiert die Frage jetzt. –

Antwort

1

der Grund, warum es nicht funktioniert ist, dass MPTT funktioniert nur auf ein Modell zu einem Zeitpunkt, in diesem Fall die Galerie, nicht das Foto.

Also tatsächlich, in Ihren Modellen ist die Galerie NICHT die Eltern des Fotos, sondern nur ein Fremdschlüssel auf dem Foto.

Wenn Sie wissen, dass das letzte Element des Rohlings ist immer ein Foto, könnte man wahrscheinlich eine Zwischen Ansicht wie folgt erstellen:

urls.py:

url(r'^(?P<path>.*)', views.photo, name='photo'), 

views.py:

def photo(self, path=''): 
    path_parts = path.split('/') 
    gallery_path = '/'.join(path_parts[:-1]) 
    photo_slug = path_parts[-1] 
    return mptt_urls.view(model='gallery.models.Category', view='gallery.views.photo_in_category', slug_field='slug')({'path': gallery_path, 'photo_slug': photo_slug}) 

def photo_in_category(request, path, gallery_instance, photo_slug=None): 
    photo_instance = Photo.objects.get(parent=gallery_instance, slug=photo_slug) 
    ... 

Andernfalls können Sie die URLs unterscheiden müssen (die auch einfacher Code bringen würde):

urls.py:

url(r'^photo/(?P<path>.*)/(?P<photo_slug>[-\w]+)/$', mptt_urls.view(model='gallery.models.Category', view='gallery.views.photo_in_category', slug_field='slug'), name='photo'), 
url(r'^gallery/(?P<path>.*)/$', mptt_urls.view(model='gallery.models.Category', view='gallery.views.category', slug_field='slug'), name='gallery'), 
+0

Wenn ich diese Methode versuchen, beschwert sich der Blick über keinen 'path' als Keyword-Argument zu bekommen. Ich habe versucht, den Pfad wie folgt zu codieren: 'category1/category2 /', habe aber den gleichen Fehler: '' Pfad wurde nicht erfasst! Bitte erfassen Sie es in Ihrer Urlconf. Beispiel: url (r \ '^ gallery/(P * ' –

+0

Sorry, ich habe erkannt, da ein Tippfehler in meiner Antwort war Können Sie es jetzt – raphv

+0

versuchen nicht zu funktionieren scheint, ist jetzt nichts können?..? umkehren. ich möchte ein uRL-Muster, die Urls wie 'Hauptkategorie umgehen konnte /' und 'Haupt Kategorie/Unterkategorie /' und 'Haupt Kategorie/Unterkategorie/article /' und auch 'Hauptkategorie/article/'ich will nicht haben' photo' und 'gallery' vor jeder uRL basierend auf, wenn es sich um eine Galerie oder ein Foto ist. ist es nicht möglich? –

Verwandte Themen