2015-04-11 2 views
-1

Какое регулярное выражение я должен писать в своих URL-адресах django для имитировать, в URL-адресе путь к файлу? Там, где есть «каталоги», «подкаталоги» и «файлы», и каждый объект из них имеет «пулю» в модели.Регулярное выражение в URL-адресах django для самореализованного модуля

Я уже сделал это:

model.py

class Directory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=100, unique=True,) 
    subdirectory = models.ForeignKey('self', null=True, blank=True) 

class File(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=100, unique=True,) 
    directory = models.ForeignKey(Directory) 

views.py

class DirectoryView(generic.DetailView): 
    model = Directory 
    template_name = 'appname/directory.html' 


class FileView(generic.DetailView): 
    model = File 
    template_name = 'appname/file.html' 

имя_приложения/urls.py

urlpatterns = [ 
    url(r'^(?P<slug>[-\w]+)/$', 
     views.DirectoryView.as_view(), name='directory'), 
    url(r'^(?P<slug1>[-\w]+)/(?P<slug>[-\w]+)/$', 
     views.FileView.as_view(), name='file'), 
] 

Результат URL для «file1.txt»:

  • folder1
  • folder2
    • subfolder1
      • file1.txt

Http: /mydomain.com/appname/subfolder1/file1txt

, но мне нужно, чтобы это было:

Http: /mydomain.com/appname/ folder2/subfolder1/file1txt

Спасибо,

ИВАН

ответ

0

Так я наконец нашел ответ в этом Джанго фрагмент кода:

https://djangosnippets.org/snippets/362/

Это то, что я получил в конце:

models.py

class Directory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=100, unique=True,) 
    parent = models.ForeignKey('self', null=True, blank=True) 

    def get_absolute_url(self): 
     url = "/%s/" % self.slug 
     cwd = self 
     while cwd.parent: 
      url = "/%s%s" % (cwd.parent.slug, url) 
      cwd = cwd.parent 
     return url 

class File(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=100, unique=True,) 
    directory = models.ForeignKey(Directory) 

views.py

from django.http import Http404 
from django.shortcuts import render, get_object_or_404 
from .models import Archive, Directory, File 

def directories(request, full_slug): 
    slugs = full_slug.split('/') 
    cwd_slug = slugs[-1] 
    directory = get_object_or_404(Directory, slug=cwd_slug) 
    if not directory.get_absolute_url().strip('/') == full_slug: 
     raise Http404 
    # if you reach this line, you've found the directory 

    context = {'directory': directory} 
    template = 'appname/directory.html' 
    return render(request, template, context) 


def files(request, full_slug, file_slug): 
    slugs = full_slug.split('/') 
    cwd_slug = slugs[-1] 
    directory = get_object_or_404(Directory, slug=cwd_slug) 
    if not directory.get_absolute_url().strip('/') == full_slug: 
     raise Http404 
    files = get_object_or_404(File, name=file_slug) 
    # if you reach this line, you've found the file 

    context = {'archive': archive_slug, 'directory': full_slug, 'file': files} 
    template = 'getdocs/file.html' 
    return render(request, template, context) 

имя_приложения/urls.py

from django.conf.urls import url, include 
from . import views 

file_patterns = [ 
    url(r'^$', views.directories, name='directory'), 
    url(r'^(?P<file_slug>(.*)[.]{1}[-\w]{3})$', views.files, name='file'), 
] 

urlpatterns = [ 
    url(r'^(?P<full_slug>(.*))/', include(file_patterns)), 
] 

Надеюсь, это поможет другим.

+0

Это соответствует http: /mydomain.com/appname/folder1/subfolder1/file1.txt – iDevFS

Смежные вопросы