1

Djangoのモデルが保存されているときにXを実行する正しい方法は何ですか?説明させてください。:)

たとえば、ブログの記事を担当するモデルがあります。まだ設定されていない場合は、タイトルフィールドを使用してスラッグフィールドを生成したいと思います。モデルが保存される直前に発生するはずです。これが私が現時点でそれを達成した方法です。

def save(self, *args, **kwargs):
    if self.slug == '':
        self.slug = slugify(self.title)
    super(Article, self).save(*args, **kwargs)

それを行う他の方法はありますか?これよりも他の方法は良いですか、どのように?

アドバイスありがとうございます!

4

3 に答える 3

2

最も適切な方法はclean、モデルのメソッドをオーバーライドすることです。

from django.template import defaultfilters

class Article(models.Model):
    ...
    def clean(self):
        if self.slug.strip() == '':
            self.slug = defaultfilters.slugify(self.title)

        super(Article, self).clean()

このメソッドは、モデルが保存される前、および一意性チェックが実行される前に呼び出されるため、問題が発生した場合でもキャッチされます。

モデルのクリーンな方法については、こちらをご覧ください。

于 2012-07-09T19:31:19.903 に答える
1

それを入力フォームに組み込み、ModelAdminまたはModelFormを使用します。

管理フォーム:

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):

    prepopulated_fields = {'slug': ('title', )}

ModelForm:

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article

    def clean_slug(self):
       if !self.cleaned_data['slug'] :
           self.cleaned_data['slug'] = slugify(self.title)
       return True

再びそのclean_slugで、最初に一意であるかどうかを確認し、そうでない場合はスラッグを一意になるように変更することをお勧めします。

于 2012-07-09T18:17:21.137 に答える
0

信号を使用することもできます。djangoに付属しているpostsaveシグナルを使用します。 https://docs.djangoproject.com/en/dev/topics/signals/

于 2012-07-09T20:46:56.980 に答える