Как реализовать метод от модели к форме

В моем models.py есть метод Model:

 class Book(model.models):
        ...
       def generate_tag(self):
          return f'{self.inspection.series_of_tags}-{str(self.tag_number).zfill(7)}'

Я хочу реализовать этот метод в моей форме, когда я нажимаю на update view, он генерирует новый тег:

class TagForm(core.ModelForm):

    def save(self, commit=True):
        instance = super().save(commit=False)

        if self.cleaned_data['tag_number']:
            instance = Book.generate_tag(self.instance)
        if commit:
            instance.save()
        return instance

    class Meta:
        model = Book
        fields = (
            'tag_number',
        )

my views.py

class BookUpdateView(BookViewMixin, core.UpdateView):
    form_class = TagForm
    template_name = 'book.html'

Я хочу, чтобы при нажатии на кнопку update view - мое поле 'tag number' отдавало метод из модели 'generate_tag' при сохранении формы! Что я делаю не так в своем коде?

Так что то, что вы делаете в своей форме сейчас, будет работать для метода класса, Book.generate_tag(self.instance). Это вызов метода класса Book.

Ваш save() также не будет работать правильно, потому что он может вернуть строку, а не объект Book;

    def save(self, commit=True):
        instance = super().save(commit=False)

        if self.cleaned_data['tag_number']:
            instance = Book.generate_tag(self.instance)
            # Here instance is a string, because `generate_tag(self.instance)` returns a string.
        if commit:
            instance.save()
        return instance

Вероятно, вы хотите исключить поле из формы, поскольку оно не получает значения изначально. Затем вы можете сгенерировать значение в представлении.

class TagForm(core.ModelForm):

    class Meta:
        model = Book
        exclude = (
            'tag_number',
        )
class BookUpdateView(BookViewMixin, core.UpdateView):
    form_class = TagForm
    template_name = 'book.html'

    
    def form_valid(self, form):
        """If the form is valid, save the associated model and generate the tag."""
        self.object = form.save(commit=False)
        tag = self.object.generate_tag()
        # do something with your generated tag, like assign it to a field.
        self.object.save()

        return super().form_valid(form)

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