4

基本的には、表示されているモデルに管理者がコメントを残す方法が必要です。管理サイト内に登録したモデルの車があり、他の管理者がこの車について短いメモを書き、名前とタイムスタンプと共に管理インターフェイスにのみ表示されるようにしたいとします。

基本的に、特定のモデルの django admin にコメント フォームを追加したいと考えています。

ビュー全体をオーバーライドせずにこれを行う方法に関する提案はありますか?

ラウンド 2 (編集)

これは、GordonsBeards の回答を使用した私の進歩です。

私の管理者の現在の様子

契約を破るわけではありませんが、それでも興味深い3つの「余分な」空のメモを追加しています.

# In models.py
class Note(models.Model):
    user = models.ForeignKey(User)
    note = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return "created on: {}".format(self.created_on)

私の User モデルは両方の管理者ユーザーを処理し、メモ機能を追加したいものです。ログインしたユーザー名を作成日の前に追加するにはどうすればよいですか?

4

5 に答える 5

2

これは古い投稿であることは知っていますが、誰かがここに到達した場合に備えて、Django に触発された私のソリューションを次に示します: How to get current user in admin forms :

models.py:

class Comment(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey("content_type", "object_id")
    user = models.ForeignKey(User)
    content = models.TextField()
    time = models.DateTimeField(auto_now_add=True)

admin.py:

class CommentInlineForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(CommentInlineForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['content'].widget.attrs['readonly'] = True


class CommentInlineFormset(BaseGenericInlineFormSet):
    def save_new(self, form, commit=True):
        setattr(form.instance, "user", self.current_user)
        return super(CommentInlineFormset, self).save_new(
            form, commit=True)


class CommentInline(GenericTabularInline):
    model = Comment
    extra = 1
    form = CommentInlineForm
    formset = CommentInlineFormset
    readonly_fields = ('user', 'time')

    def has_delete_permission(self, request, obj=None):
        return False

    def get_formset(self, request, obj=None, **kwargs):
        formset = super(CommentInline, self).get_formset(
            request, obj, **kwargs)
        formset.current_user = request.user
        return formset

注 1: ここで重要なのは、GenericTabularInline.get_formset() を上書きして request.user に渡し、それを使用して BaseGenericInlineFormSet.save_new() の「user」フィールドに入力することです。ログインしたユーザーが正しく記録されるようにします。他のコードは、「コメント」のようにするためのものです。たとえば、読み取り専用フィールド、削除なしなど。

注 2: これは一般的な解決策であるため、コメントするモデルに関係なく、追加するだけです

inlines = [CommentInline,]

admin クラスに移動します。

于 2015-05-20T01:50:01.993 に答える
2

「ビュー全体をオーバーライドする」というのが何を意味するのかわかりません。この種のことが Django をとても使いやすくしている理由であり、余分な機能を余計な手間をかけずにボルトで固定できるからです。足全体を口に入れるつもりはないと仮定すると、これは私がそれにアプローチする方法です:

何かにメモを追加するのはそれほど難しいことではありません。別のモデルを定義して、 のcars.modelsようなものを追加するだけNotesです。次に、このモデルが外部キーと zippozappo であるため、Cars モデルを参照するようにします。

管理者のみに「制限」することに関しては、公開ビューで人々がメモを追加したり、メモを表示したりできない限り、管理アプリケーションの外部に表示されるべきではありません。

サイト/models.py

from django.contrib.auth.models import User
# snip your stuff...
class Notes(models.Model)
    user = models.ForeignKey('auth.User')
    author = models.ForeinKey('auth.User')
    note = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)

この後必ず./manage syncdb

サイト/admin.py

from site.models import Notes
from django.contrib.auth.models import User

class NotesInline(admin.StackedInline):
    model = Notes
    extra = 0

class UserAdmin(UserAdmin):
    inlines = [NotesInline,]

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

各車の最後にあるメモの表示をカスタマイズしたい場合に備えて、インライン管理機能を使用するための注意事項を次に示します: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django .contrib.admin.ModelAdmin.inlines

もちろん、これを好きなように拡張/変更/変更できますが、モデルに追加機能を追加するために難しいことをする必要はありません。

ユーザーだけでなく、任意のオブジェクトにコメントできる Notes アプリを作成するのが理想的です。

編集

class NotesInlineを持っていextra=0ます。これにより、デフォルトでユーザー ページに 3 つのレコードが表示されなくなります。

class Notes最初に誰がメモを残したauthor = models.ForeinKey('auth.User')のかを追跡する必要があります。これにより、メモを残す人を選択できるドロップダウン ボックスが追加されます。私の理解が正しければ、現在ログインしているユーザーがこのフィールドを自動入力するようにしてください。これを強制することの問題は、管理パネルではすべての管理者が (パーミッションによって制限されていない限り) 平等に作成されるため、このauthorフィールドを現在ログインしているユーザーに制限するには、必要以上に手間がかかることです。

これらのフィールドに自動入力するポイントまで管理パネルを拡張する必要がある場合は、他のパブリック ビューを作成し、アクセス許可を持つユーザーにアクセスを制限する必要があります。または、管理ビュー/テンプレートを自分でオーバーライドし始める必要があります。これは、Django の管理パネルの設計上の機能のようなものです。これは、必ずしもすべてのユーザー入力パネルではなく、テーブルの変更に使用する必要があります。

もう 1 つの頭痛の種: Django は既存のsyncdbテーブルを変更しないため、既存のモデルから列を追加/削除する場合は、テーブルを削除して再作成するか、django-evolutionなどを使用する必要があります。ただし、その使用は別の質問です。

于 2013-03-01T19:20:17.503 に答える
-1

管理者を掘り下げることなく、最も簡単な方法は、javascript を使用して管理者インターフェースにコメント フォームを挿入することです。コメントを保存するためのモデルを作成する必要があります (組み込みのコメント システムを使用できる場合もありますが、その価値よりも問題が発生する可能性があります)、コメントを取得して保存するための ajax と、取得したコメントとコメントフォームをレンダリングします。

次に、スクリプトへの参照を管理テンプレートに含めるだけでよく、管理者の内部に触れる必要はありません。

于 2013-03-01T19:15:09.807 に答える