Лучшая практика для передачи атрибута из ModelForm.clean () в Model.save () - PullRequest
0 голосов
/ 20 марта 2020
class MyModel(models.Model):
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if getattr(self, 'my_attr', False):
            # do things


class MyForm(forms.ModelForm):
    def clean(self)
        cleaned_data = super().clean()
        if self.has_changed():
            self.instance.my_attr = self.get_the_needed_info()
        return cleaned_data

    class Meta:
        model = MyModel
        fields ='__all__'


@admin.register(MyModel)
class MyAdmin(admin.ModelAdmin)
    form = MyForm

Во время MyModel.save() мне нужно проверить условие, которое оценивается в ModelForm.clean().

Во время clean() я присваиваю атрибут my_attr self.instance.

Есть есть какая-то причина, по которой я скучаю, что требует рефакторинга?

1 Ответ

0 голосов
/ 26 марта 2020

В соответствии с django документами рекомендуется использовать ModelForm для установки существующего атрибута экземпляра.

views.py:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from myapp.models import Author

class AuthorCreate(LoginRequiredMixin, CreateView):
    model = Author
    fields = ['name']

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super().form_valid(form)
...