Nano Hash - криптовалюты, майнинг, программирование

Проблема создания нового универсального связанного объекта внутри общих встроенных форм администратора

У меня странная проблема с общими встроенными формами администратора. У меня есть две модели: основной проект и видео с отношением ManyToMany через VideoLink, потому что мне нужно иметь возможность связывать разное количество видео с проектом и много проектов с видео:

class VideoLink(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    video = models.ForeignKey(Video)

class Project(models.Model):
    name = models.CharField(max_length=50)
    image_set = generic.GenericRelation('Image')

Я не показывал видео модель здесь, но это не важно для моего вопроса.

Все, что мне нужно, это определить новый связанный объект (VideoLink), связанный с основным объектом (Project) двумя способами:

  • выберите Видео внутри встроенных форм администратора (это работает очень хорошо!)
  • определите URL-адрес нового видео в поддельном поле video_url, создайте новый объект Video и создайте новый объект VideoLink между основным (Project) и новым (Video) объектами.

Во втором случае мне нужно установить среднюю функциональность. Он будет обрабатывать URL-адрес нового видео (например, http://www.youtube.com/watch?v=WIXVzeB0DUo), создайте новый объект Video и синхронизируйте его с youtube.com. Я думаю, что лучший способ - поместить это в форму AdminVideoLink чистый метод, я прав?

Итак, я написал этот код:

class VideoForm(forms.ModelForm):

    # new field for absolute video urls
    video_url = forms.CharField()

    def clean(self):
        cleaned_data = self.cleaned_data
        if not cleaned_data.get('id') and not cleaned_data.get('video') and cleaned_data.get('video_url'):
            ... some extra functionality:
            1) get id from video_url
            2) create new Video object with id
            3) define cleaned_data['video'] = <Video object>
             ....  

        return cleaned_data

class VideoInline(generic.GenericTabularInline):
    model = VideoLink
    form = VideoForm

class ProjectAdmin(admin.ModelAdmin):
    inlines = [VideoInline]

Но каждый раз после сохранения формы я вижу ошибку внутри встроенной формы администратора: возле выбора с видеообъектами - "поле обязательно" (мой перевод). Но я установил это поле внутри моего чистого метода. Я проверяю: self.cleaned_data['video'] содержит мой новый объект Video, только что созданный и синхронизированный.

И еще одна очень странная проблема: я не могу найти родительский экземпляр (основной объект проекта) внутри этого чистого метода. Если я делаю то же самое с простыми объектами ManyToMany (без общего отношения и форм generic.GenericTabularInline), я вижу поля видео и проекта внутри своей встроенной формы, но в общем случае у меня его нет.

Я проверил связанный сообщение, но не т найти ответ.


Ответы:


1

Решить эту проблему очень просто, просто добавьте required=False во встроенную форму:

class VideoForm(forms.ModelForm):

    video_url = forms.CharField(required=False, widget=AdminVideoPreviewWidget())

    def __init__(self, *args, **kwargs):
        super(VideoForm, self).__init__(*args, **kwargs)
        self.fields['video'].required = False

    ....

С его помощью я могу заполнить поле видео вручную после создания и синхронизации нового объекта «Видео».

03.06.2009
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..