2017-12-26 6 views
0

Ich schrieb diesen Code, der dynamisch URL-Muster aus der Datenbank generiert. Diese URLs haben nur einen Ebenenpfad: domain.com/something.Django 2.0 generieren dynamisch urlpatterns

SomeApp/models.py

class SomeModel(models.Model): 
    pattern = models.CharField(max_length=50) 
    name = models.CharField(max_length=50) 
    text = models.CharField(max_length=50) 

SomeApp/apps.py

class SomeAppConfig(AppConfig): 
    name = 'someapp' 

    def ready(self): 
     from .models import SomeModel 
     from .urls import urlpatterns 
     from . import views 

     urls_in_db = SomeModel.objects.all() 
     for url_in_db in urls_in_db: 
      urlpatterns.append(path(url_in_db.pattern, 
            views.SpecialView.as_view(), 
            name=url_in_db.name) 

SomeApp/views.py

class SpecialView(generic.TemplateView): 
    template_name = 'template/view_template.html' 
    model = SomeModel 

    def get_context_data(self, **kwargs): 
     context = super(SpecialView, self).get_context_data(**kwargs) 
     context['content'] = SomeModel.objects.get(pattern=self.request.path) 
    return context 

Ist th ist die Lösung ein Anti-Pattern? Und wenn ja, warum? Danke

Antwort

1

Ja, Ihre Lösung ist ein Anti-Muster. Django unterstützt Parameter in URL-Mustern, die erfasst und in der entsprechenden Ansicht verfügbar werden. Mit diesen URL-Parametern können Sie ein einzelnes URL-Muster für jeden Datensatz eines bestimmten Typs in Ihrer Datenbank schreiben und pflegen.

Werfen Sie einen Blick auf this example der URL-Parameter.

Beachten Sie auch, wie Ihre Lösung möglicherweise sehr schlechte Leistung haben könnte, da Sie möglicherweise Millionen von URL-Mustern abhängig von der Größe Ihrer Datenbank erstellen.

+0

Danke für Ihre Antwort! – Greg

+0

Ich bin froh, dass ich helfen konnte! – ndmeiri