ИМ
March 24, 2022, 7:34 p.m.

Прикрутить форму к админ-панели

django, forms, adminmodel

Доброго времени суток! Прошу помощи прикрутить форму загрузки медиаконтента в админ-панели. Дано:

Модель контента

  1. class MediaItem(models.Model):
  2. video = VideoField( upload_to = upload_to,
  3. width_field = 'video_width', height_field = 'video_height',
  4. rotation_field = 'video_rotation',
  5. mimetype_field = 'video_mimetype',
  6. duration_field = 'video_duration',
  7. thumbnail_field = 'video_thumbnail')
  8. video_width = models.IntegerField(null = True, blank = True)
  9. video_height = models.IntegerField(null = True, blank = True)
  10. video_rotation = models.FloatField(null = True, blank = True)
  11. video_mimetype = models.CharField(max_length = 32, null = True, blank = True)
  12. video_duration = models.IntegerField(null = True, blank = True)
  13. video_thumbnail = models.ImageField(null = True, blank = True)
  14. video_mp4 = VideoSpecField(source = 'video', format = 'mp4')
  15. video_ogg = VideoSpecField(source = 'video', format = 'ogg')
  16. video_webm = VideoSpecField(source='video', format='webm')
  17.  
  18. def __unicode__(self):
  19. return self.video.name
  20.  
  21. def video_specs_generated(self):
  22. if self.video_mp4.generated() and self.video_ogg.generated():
  23. return True
  24.  
  25. return False

Форма

  1. from videokit.forms import VideoField
  2.  
  3. class MediaItemCreateForm(forms.Form):
  4. video = VideoField()

Представление

  1. def item_create(request):
  2. template = 'app/item_create.html'
  3.  
  4. item_create_form = MediaItemCreateForm()
  5.  
  6. if request.method == 'POST':
  7. item_create_form = MediaItemCreateForm(request.POST, request.FILES)
  8.  
  9. if item_create_form.is_valid():
  10. video = request.FILES.get('video', None)
  11.  
  12. if video:
  13. media_item = MediaItem(video = video)
  14. media_item.save()
  15.  
  16. media_item.video_webm.generate()
  17.  
  18. return HttpResponseRedirect(reverse('list'))
  19.  
  20. context = {
  21. 'item_create_form' : item_create_form,
  22. }
  23.  
  24. return render(request, template, context)

Ну и дефолтный класс в admin.py

  1. class MediaItemAdmin(admin.ModelAdmin):
  2. pass
  3.  
  4. admin.site.register(MediaItem, MediaItemAdmin)

Вопрос заключается в следующем: что написать в дефолтном классе админки чтоб работала загрузка файла через админку а не с сайта.

2

Do you like it? Share on social networks!

11
Илья Чичак
  • March 24, 2022, 8:31 p.m.
  • (edited)

я думаю, для админки стоит сделать отдельную форму и указать ее в MediaItemAdmin

https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

    ИМ
    • March 24, 2022, 8:40 p.m.
    1. from django.contrib import admin
    2. from app.models import MediaItem
    3. from django import forms
    4. from videokit.forms import VideoField
    5. # Register your models here.
    6.  
    7. class MediaItemForm(forms.ModelForm):
    8.  
    9. class Meta:
    10. model = MediaItem
    11.  
    12. video = VideoField()
    13.  
    14. class MediaItemAdmin(admin.ModelAdmin):
    15. form = MediaItemForm
    16.  
    17. admin.site.register(MediaItem, MediaItemAdmin)

    Как то так. Но ничего не работает.

      Илья Чичак
      • March 24, 2022, 10:25 p.m.

      ничего не работает - не очень информативное сообщение

      какие ошибки происходят?

      на что ругалось в первоначальном варианте?

        ИМ
        • March 24, 2022, 10:38 p.m.
        • (edited)

        Просто загружается медиафайл, но не кодируется. Кодирование вызывает эта форма через представление. Мне же нужно это реализовать в админ-панели.

          Илья Чичак
          • March 25, 2022, 1:44 a.m.
          • The answer was marked as a solution.

          это можно сделать через метод save в форме https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#the-save-method

          1. class MediaItemForm(forms.ModelForm):
          2.  
          3. class Meta:
          4. model = MediaItem
          5.  
          6. video = VideoField()
          7.  
          8. def save(self, *args, **kwargs)
          9. item = super().save(*args, **kwargs)
          10. item.video_webm.generate()
          11. return item

          или через метод save_model класса админки
          https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

          хотя я бы посоветовал вынести все это в отдельную функцию/класс, который бы использовался и во view и в админке

            ИМ
            • March 25, 2022, 2:10 a.m.

            Благодарю вас. Все работает.

            хотя я бы посоветовал вынести все это в отдельную функцию/класс, который бы использовался и во view и в админке

            В том то и дело, что мне это пока не нужно. Нужна админка. Еще раз благодарю.

              Илья, простите за вопрос. У меня при повторном обновлении файла контента он не кодируется. Кодируется только при создании нового. Только что заметил этот баг. Что написать чтоб при обновлении он также кодировался как и при добавлении нового?

                Илья Чичак
                • March 27, 2022, 4:46 a.m.

                я думаю, стоит пернесети логику вызова кодирования в метод save() модели. Возможно, будет накладно, но с таким минимумом вводных ппредложить что-то лучше у меня врядли получится.

                только при этом, надо убрать вызов кодирования из view. оно будет вызываться так же из метода save модели

                  А вчем разница? все равно же вызывается метод из формы.

                    Илья Чичак
                    • March 28, 2022, 4:10 p.m.

                    А вчем разница? все равно же вызывается метод из формы.

                    разница между чем и чем?

                      ИМ
                      • March 29, 2022, 1:53 a.m.

                      Между вывом кодирования из модели и из формы

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        • Last comments
                        • Evgenii Legotckoi
                          March 9, 2025, 9:02 p.m.
                          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                        • VP
                          March 9, 2025, 4:14 p.m.
                          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                        • ИМ
                          Nov. 22, 2024, 9:51 p.m.
                          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                        • Evgenii Legotckoi
                          Oct. 31, 2024, 11:37 p.m.
                          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                        • A
                          Oct. 19, 2024, 5:19 p.m.
                          Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html