Как реализовать метод от модели к форме
В моем 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)