の保存方法で私のブログの記事のモデルはタグの多対多のフィールドがあります。Djangoのadmin.py:save_model()(model.saveによって呼び出されていない)のModelForm
tags = models.ManyToManyField(PostTag)
をしかし、それはでしたその後、私は私のadmin.py
を修正
def _get_tagging(self): # Returns comma separated list of tags
tagging = []
for tag in self.tags.all():
tagging.append(tag.name)
return ", ".join(tagging)
def _set_tagging (self, tagging): # Saves tags from comma separated list
tagging = tagging.split(", ")
self.tags.clear()
for tag in tagging:
if len(tag) < 1:
continue
try:
self.tags.add(PostTag.objects.get(name=tag))
except ObjectDoesNotExist:
self.tags.create(name=tag)
tagging = property(_get_tagging, _set_tagging)
:それを編集して不快と私はこのような私のモデルを修正
class BlogAdminForm (forms.ModelForm):
tagging = forms.CharField(required=False, label="Tags", max_length=200,
widget=forms.TextInput(attrs={'class':'vTextField'}))
class Meta:
model = BlogPost
def __init__(self, *args, **kwargs):
super(BlogAdminForm, self).__init__(*args, **kwargs)
if kwargs.has_key('instance'):
instance = kwargs['instance']
self.initial['tagging'] = instance.tagging
def save(self, commit=True):
model = super(BlogAdminForm, self).save(commit=False)
model.tagging = self.cleaned_data["tagging"]
if commit:
model.save()
return model
そして、これはうまくいきましたが、オブジェクトを編集する場合にのみ有効です。新しいオブジェクトを作成しようとしたときにエラーが発生しました。どうして?多対多リレーションシップは、データベースにまだ存在せず、プライマリキーを持たないオブジェクト(「BlogPost」インスタンスはプライマリキー値を持つ必要があります。利用される)。私はこのようにsaveメソッドを編集して解決しようとしました:
def save(self, commit=True):
model = super(BlogAdminForm, self).save(commit=False)
try:
model.tagging = self.cleaned_data["tagging"]
except ValueError:
model.save()
model.tagging = self.cleaned_data["tagging"]
if commit:
model.save()
これは元の問題を解決しました。しかし、今model.save()
は私の管理モデルのsave_model
メソッドを呼び出していません。この結果で
class BlogAdmin (admin.ModelAdmin):
# ...
form = BlogAdminForm
def save_model(self, request, obj, form, change):
obj.author = request.user
obj.save()
を私は新しいエラーを取得する:null value in column "author_id" violates not-null constraint.
私は間違って何をしているのですか?このメソッドを手動で呼び出すことはできますか?
は、このような偉大な答えをありがとうございました!また、文体の改善に感謝します。私は自分の仕事でそれらを考慮に入れます。 –