Django: включить get_absolute_url () в абстрактную модель? - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над проектом, который позволяет пользователю заполнять и сохранять контрольные списки, необходимые для гастрономии.Поскольку содержимое контрольных списков отличается друг от друга, я решил создать абстрактный базовый класс «контрольные списки» с общими полями и иметь дочерние модели для различных атрибутов.

Я хочу найти способ динамического создания уникальных URL-адресов длякаждый контрольный список через абстрактную модель.Единственный способ, которым я могу заставить это работать до сих пор, состоит в том, чтобы включить get_absolute_url () в каждую дочернюю модель - но таким образом я должен вручную определить URL в моих шаблонах url и различных представлениях для каждой дочерней модели.Похоже на ненужное повторение.

Я попытался включить get_absolute_url () в мою абстрактную модель.Однако это не работает, потому что я не могу получить доступ к атрибутам дочернего элемента в абстрактной модели.Есть ли способ включить get_absolute_url () в мой абстрактный базовый класс?

Я ценю вашу помощь!Большое спасибо!

Это часть кода:

models.py

class Checklisten(models.Model):
    # abstract model that contains shared features of all checklists

    erlaubte_pruefer = models.ForeignKey(Pruefer, on_delete=models.CASCADE, 
    verbose_name='Prüfer')
    pruefende_firma = models.ForeignKey(settings.AUTH_USER_MODEL, 
    on_delete=models.CASCADE, verbose_name='Unternehmen')
    raum_verbindung = models.ManyToManyField(Raeume, verbose_name='Ort')
    datum = models.DateField('Datum', auto_now_add=True, blank=False)

    class Meta:
        ordering = ['datum', 'pruefende_firma', 'raum_verbindung', 
        'erlaubte_pruefer']
        abstract = True
        verbose_name = 'Checkliste'
        verbose_name_plural = 'Checklisten'

        # can I include a get_absolute_url() with pk, datum AND a abbreviated 'bezeichnung' here?

class Checklisten_Schaedlinge(Checklisten):

    insekten_befall = models.BooleanField('Insektenbefall', default=False)
    befall_art = models.CharField('Insektenart des Befalls', blank=True, 
    null=True, max_length=40)
    bezeichnung = 'Schädlingsmonitoring/Bekämpfung'

    class Meta:
        verbose_name = 'Schädlingsmonitoring/Bekämpfung'
        verbose_name_plural = 'Schädlingsmonitoring/Bekämpfung'

    def __str__(self):
        return '%s - %s'%(self.datum, self.bezeichnung)

    def get_absolute_url(self):
        return reverse('checkliste-detail', kwargs={'pk' : self.pk,
                                              'datum' : self.datum})


class Checklisten_Waagen_Thermometer(Checklisten):

    WAAGE = 'WA'
    THERMOMETER = 'TH'

    ART = (
        (WAAGE, 'Waage'),
        (THERMOMETER, 'Thermometer')
    )

    werkzeug_art = models.CharField('Art', choices=ART, default=WAAGE, 
    max_length=40)
    geeicht = models.BooleanField('geeicht', default=False)
    naechster_eichtermin = models.DateField('Nächster Eichtermin')
    bezeichnung = 'Erfassungsliste Waagen & Thermometer'

    class Meta:
        verbose_name = 'Erfassungsliste Waagen & Thermometer'
        verbose_name_plural = 'Erfassungslisten Waagen & Thermometer'

    def __str__(self):
        return '%s - %s'%(self.datum, self.bezeichnung)

    def get_absolute_url(self):
        return reverse('checkliste-waage', kwargs={'pk' : self.pk,
                                              'datum' : self.datum})

urls.py

    urlpatterns = [
        path('meine-checklisten/schaedlinge/<pk>/<datum>/, views.Checklisten_Schaedlinge_Detail_View.as_view(), name='checkliste- 
        schaedlinge'),
        path('meine-checklisten/waagen/<pk>/<datum>/', views.Checklisten_Waagen_Detail_View.as_view(), name='checkliste- 
        waage'),]

views.py

class Checklisten_Schaedlinge_Detail_View(LoginRequiredMixin, DetailView):
    model = Checklisten_Schaedlinge
    template_name = 'checklisten/checkliste-schaedlinge-detail.html'

class Checklisten_Waagen_Detail_View(LoginRequiredMixin, DetailView):
    model = Checklisten_Waagen_Thermometer
    template_name = 'checklisten/checkliste-schaedlinge-detail.html'
...