Python / Django создание нескольких классов от переменной до цикла - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю с Python Django и пытаюсь создать форум с несколькими подстраницами - каждая подстраница относится к другой теме c и должна выглядеть одинаково, но хранить разные сообщения. Я хочу создать несколько классов (не экземпляров!) С одинаковыми именами и одинаковыми атрибутами. Каждый класс должен иметь другое имя шаблона и отображать другие сообщения. Примерно так:

my_variable = 'part_of_class_name'

for class_number in range(2, 5):
    class_name = my_variable + str(class_number) + '(SameParentClass)'

    class class_name:
         template_name = 'template' + str(class_number) + '.html'

Конечно, приведенный выше код не работает, есть ли возможность передать переменную в имя класса? Я хочу следующее: part_of_class_name2 (SameParentClass), part_of_class_name3 (SameParentClass), part_of_class_name4 (SameParentClass). Как я могу сделать это с помощью цикла? Я хочу избежать трех занятий.

1 Ответ

0 голосов
/ 17 апреля 2020

Создание трех отдельных классов, которые делают одно и то же, не соответствует философии DRY

Почему бы не создать отдельный класс, который принимает параметр, и использовать этот параметр для получения конкретное c поведение, которое вы хотите?

class ClassName:
    def __init__(self, class_number):
        self.template_name = 'test' + str(class_number) + '.html'


a = ClassName(1)
b = ClassName(2)
c = ClassName(3)

print(a.template_name)
print(b.template_name)
print(c.template_name)

Возвращает:

test1.html
test2.html
test3.html

Редактировать на основе вашего комментария - вы не можете вызвать as_view() для экземпляра, но вы можете передайте ему параметр, который класс использует для установки шаблона ... примерно так:

urls.py:

from django.urls import path
from .views import ForumView

urlpatterns = [
    path('a', ForumView.as_view(template_name='a')),
    path('b', ForumView.as_view(template_name='b')),
    path('c', ForumView.as_view(template_name='c')),
]

views.py:

from django.template.response import TemplateResponse
from django.views.generic.base import View


class ForumView(View):
    template_name = None

    def get(self, request, *args, **kwargs):
        return TemplateResponse(request, self.template_name + '.html')

Это загрузит a.html для запроса к a url, b.html для b url, et c ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...