Пользовательский миксин для получения вербального имени, не отображаемого при вызове в Django DetailView

Я создал пользовательский миксин GetVerboseNameMixin, чтобы получить вербальные имена полей модели, а затем отобразить их в моем html-шаблоне с помощью DetailView. Однако всякий раз, когда я пытаюсь вывести список словесных имен, ничего не возвращается, и я не могу понять, почему. Любая помощь будет очень признательна.

Mixin.py:

class GetVerboseNameMixin:
    def get_verbose_name(model, fields=[]):
        verbose_names = []
        for field in fields:
            verbose_names.append(str(model._meta.get_field(field)))
        return verbose_names

Вид:

class ShowProfileView(GetVerboseNameMixin, DetailView):
    model = Profile
    template_name = 'profiles/user_profile.html'
    verbose_model_fields = GetVerboseNameMixin.get_verbose_name(model=Profile, fields=['first_name', 'surname', 'date_of_birth', 'phone_number', 'bio', 'gender', 'emergency_contact_name', 'emergency_contact_number'])



    def get_context_data(self, *args, **kwargs):
        context = super(ShowProfileView, self).get_context_data(*args, **kwargs)
        user_profile = get_object_or_404(Profile, id=self.kwargs['pk']) 
        context["user_profile"] = user_profile
        return context

    def get_object(self, *args, **kwargs):
        obj = Profile.objects.filter(id=self.kwargs['pk']).values('first_name', 'surname', 'date_of_birth', 'phone_number', 'bio', 'gender', 'emergency_contact_name', 'emergency_contact_number') # list of dictionaries
        object = obj[0]
        return object

Html шаблон:

{% extends "base.html" %}

{% block content %}

    <h1>Profile</h1>
    <br/><br/>
    {% csrf_token %}
    <ul>
    {% for v in object.values %}
    {% for field_name in verbose_model_fields %}
    <p>{{field_name}}: {{ v }}</p>
    {% endfor %}
    {% endfor %}
    </ul>
    <a href='{% url "profiles:edit_profile" pk=user.profile.id %}'>Edit Profile</a>


{% endblock %}

Даже если я просто сделаю рендеринг:

{{ verbose_model_fields }}

В моем html-файле ничего не отображается. Это наводит меня на мысль, что проблема в моем миксине, или, возможно, функция вызывается неправильно?

Я не понимаю, как verbose_model_fields передается в шаблон из представления, а также не нашел упоминания в документации DetailView. Я предполагаю, что вы хотите иметь эту пользовательскую реализацию, если так, то вам нужно передать этот параметр через context:

class ShowProfileView(GetVerboseNameMixin, DetailView):
    ...

    def get_context_data(self, *args, **kwargs):
        context = super(ShowProfileView, self).get_context_data(*args, **kwargs)
        user_profile = get_object_or_404(Profile, id=self.kwargs['pk']) 
        context["user_profile"] = user_profile  # redundant implementation, you can get this value by `object` context variable in template
        context["verbose_model_fields"] = self.verbose_model_fields  # or just call self.get_verbose_name(...) method
        return context

Также в этом решении я отметил избыточную реализацию, что вам не нужно повторно реализовывать, как получить объект, потому что об этом уже позаботились DetailView.

Вернуться на верх