@vagitaku

Можно в admin.py вытащить данные из models.p(из функции __str__)?

В mdoles.py создал переменную days (в def str). Нужно как-то вставить ее в list_display в admin.py.
models.py:
class DriverWorkDay(models.Model):
    driver = models.OneToOneField(
        AdvancedUser,
        on_delete=models.CASCADE,
        verbose_name='Водитель')
    monday = models.BooleanField(
        default=False,
        verbose_name='Понедельник')
    tuesday = models.BooleanField(
        default=False,
        verbose_name='Вторник')
    wednesday = models.BooleanField(
        default=False,
        verbose_name='Среда')
    thursday = models.BooleanField(
        default=False,
        verbose_name='Четверг')
    friday = models.BooleanField(
        default=False,
        verbose_name='Пятница')
    saturday = models.BooleanField(
        default=False,
        verbose_name='Суббота')
    sunday = models.BooleanField(
        default=False, 
        verbose_name='Воскресенье')
    time_from = models.TimeField(
        null=False,default= '09:00:00',
        verbose_name='Время с')
    time_to = models.TimeField(
        null=False,default= '19:00:00',
        verbose_name='Время до')

    def __str__(self):
        days = []
        if self.monday:
            days.append('понидельник')
        if self.tuesday:
            days.append('вторник')
        if self.wednesday:
            days.append('среда')
        if self.thursday:
            days.append('чтверг')
        if self.friday:
            days.append('пятница')
        if self.saturday:
            days.append('суббота')
        if self.sunday:
            days.append('воскресенье')
        days = ', '.join([str(x) for x in days])
        time = f'(С {self.time_from} по {self.time_to})'
        return f'({self.driver.user.last_name} {self.driver.user.first_name} -- {days}, {time})'

    class Meta:
        verbose_name = 'Рабочий день водителя'
        verbose_name_plural = 'Рабочии дни водителей'

admin.py:
class DriverWorkDayAdmin(admin.ModelAdmin):
    list_display = ['driver', 'get_work_days', 'get_times']
    search_fields = ['driver']

    def get_work_days(self, obj):
        return obj.days

    def get_times(self, obj):
        return None

    class Meta:
        model = DriverWorkDay

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        driver = form.base_fields["driver"]

        driver.widget.can_add_related = False
        driver.widget.can_change_related = False

        return form

Выдает такую ошибку -
'DriverWorkDay' object has no attribute 'days'

Или можно только в admins.py создавать строку на основании рабочих дней?
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
@FulTupFul
Ну вы же сами используете методы ModelAdmin для отображения. Просто в методе get_work_days верните str(obj)
Хотя это плохая практика. Правильнее будет написать отдельный метод который вернет вам дни недели.
В models.py:
class DriverWorkDay(models.Model):
    ..................
    @property
    def days(self):
        days = []
        if self.monday:
            days.append('понидельник')
        if self.tuesday:
            days.append('вторник')
        if self.wednesday:
            days.append('среда')
        if self.thursday:
            days.append('чтверг')
        if self.friday:
            days.append('пятница')
        if self.saturday:
            days.append('суббота')
        if self.sunday:
            days.append('воскресенье')
        days = ', '.join([str(x) for x in days])
        time = f'(С {self.time_from} по {self.time_to})'
        return f'({self.driver.user.last_name} {self.driver.user.first_name} -- {days}, {time})'

В admin.py:
class DriverWorkDayAdmin(admin.ModelAdmin):
    list_display = ('driver', 'get_work_days', 'get_times')
    
    def get_work_days(self, obj):
        return obj.days
    
    ............
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы