Предполагается, что метод save()
возвращает объект, независимо от того, сохранен он или нет. Он должен скорее выглядеть следующим образом:
def save(self, commit=True):
input_name = self.cleaned_data.get('input_name')
if input_name == "MyKeyword":
commit = False
return super().save(commit=commit)
Однако, как вы можете видеть here и here, форма уже вызывается с commit=False
и объект сохраняется позже в save_model()
метод вашего ModelAdmin
. Вот почему вы получили AttributeError 'NoneType' object has no attribute 'save'
. Если вы проверите трассировку исключения, я уверен, что ошибка исходит от this line.
Таким образом, вы должны, кроме того, переопределить ваш ModelAdmin
«ы save_model()
метода:
def save_model(self, request, obj, form, change):
if form.cleaned_data.get('input_name') == 'MyKeyword':
return # Don't save in this case
super().save_model(request, obj, form, change)
# And you'll also have to override the `ModelAdmin`'s `save_related()` method
# in the same flavor:
def save_related(self, request, form, formsets, change):
if form.cleaned_data.get('input_name') == 'MyKeyword':
return # Don't save in this case
super().save_related(request, form, formsets, change)
Учитывая Ваш комментарий в этом ответе
It is working now but I just have one related question. The admin site will still display a green banner at the top saying "The model was added successfully". Can I override some method so that it is red and says "The model already exists"?
Похоже, что вы хотите сделать это не переопределяет метод сохранения, а controlling form validation. Что совершенно другое. Вам просто нужно переопределить метод вашей формы.
from django import forms
def clean(self):
"""
super().clean()
if self.cleaned_data.get('input_name') == 'MyKeyword':
raise forms.ValidationError("The model already exists")
Или, еще лучше, так как это выглядит, как вы хотите clean a single field:
from django import form
def clean_input_name(self):
data = self.cleaned_data['input_name']
if data == 'MyKeyWord':
raise forms.ValidationError("The model already exists")
Однако я думаю input_name
также поле вашей модели, и вы не хотите, чтобы поднять этот ошибка только в одной форме, но во всем вашем проекте. В этом случае, вы ищете Model validators:
from django.core.exceptions import ValidationError
def validate_input_name(value):
if value == 'MyKeyword':
raise ValidationError("The model already exists")
Так что не так с этим кодом? Вы можете упростить его, изменив условие на 'if input_name! =" MyKeyword ": super (MyCustomForm, self) .save (commit = commit)', но кроме этого он должен работать так, как вы его написали. – xbello
Я пробовал это, но ошибка: AttributeError 'NoneType' объект не имеет атрибута 'save' – Rueen1963
Тогда, может быть, ваш ModelForm не возвращает сохраненный объект: он возвращает «None». Прочтите этот ответ http://stackoverflow.com/a/817364/1688590. – xbello