2013-03-01 28 views
3

「意見」基本上我想一個辦法有管理員離開正在瀏覽的模型意見。比方說,我們有一個模型車,我已經在管理網站上註冊了,我想讓其他管理員寫一個關於這輛車的簡短說明,並且只在管理界面中顯示它們以及它們的名稱和時間戳。形式在Django管理的「筆記」或模型

基本上我想在Django管理加評論的形式爲特定模型。

如何做到這一點沒有覆蓋整個視圖有什麼建議?

回合2(EDIT)

這是使用GordonsBeards回答我的進步。

how my admin looks now

它增加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) 

我的用戶模型處理兩個管理員用戶,這是我想添加筆記功能。我如何在創建的日期前添加登錄用戶名?

+0

要刪除額外的字段,請在'NotesInline'中添加'extra = 0'。同樣在你的'Note Note'中,沒有ForeignKey將這個音符與對象(Car)鏈接起來。如果沒有這個,筆記就不知道它留在哪裏,只是誰寫的,寫的是什麼,寫什麼的。 – GordonsBeard 2013-03-01 20:41:50

+0

'return「{1}創建了關於{0}的註釋」。format(self.created_on,self.user.name)' – GordonsBeard 2013-03-01 20:42:43

+0

儘管如此,我正在使用用戶模型的註釋功能,但管理員未以該用戶身份登錄。 So Car = User,現在我想要一個作者=登錄用戶。我清楚了嗎? – Chris 2013-03-01 20:44:42

回答

2

我不知道你所說的「覆蓋整個視圖」的意思,因爲這種東西是什麼使這樣的Django漂亮的使用,對額外的功能螺栓沒有太多大驚小怪的能力。假設我不打算把我的整個腳放到嘴裏,這就是我的方法:

添加註釋不應該太困難,只需在cars.models內定義另一個模型並添加類似Notes。然後,只需將此模型引用Cars模型,因爲它是外鍵和zippozappo - 您已經有了自己的一些筆記。

至於「限制」它只有管理員,除非你的公衆意見讓人們添加筆記或顯示筆記,它不應該出現在管理應用程序之外。

網站/ 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在此之後!

網站/管理員。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管理面板的一個設計特性 - 它應該用於修改表格,不一定是最終用戶輸入面板。

一個比較頭痛的: Django的syncdb不會改變已經存在的,所以如果你想添加/從現有模型中刪除列,你需要刪除並重新創建該表,或使用類似django-evolution表。然而,這是另一個問題的使用。

+0

這可能是要走的路。雖然我還沒有完全想到它。我會用我的進度更多的信息更新我的原始問題。 – Chris 2013-03-01 20:16:26

-1

沒有挖掘到的管理,最簡單的方法是將注入註釋形式與JavaScript的管理接口。您需要創建一個模型來存儲評論(您可能可以使用內置的評論系統,雖然這可能比它的價值更麻煩),一些用於檢索和保存評論的ajax,以及一個JavaScript小部件呈現檢索到的評論和評論表單。

然後,您只需要在管理模板中包含對腳本的引用,而不必觸摸任何管理員內部。

+0

感謝您的回答! – Chris 2013-03-01 21:22:00

1

我知道這是一個古老的職位,但以防萬一有人到達這裏,這是我的解決方案,通過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.sav中的「user」字段e_new()。以便登錄的用戶被正確記錄。其他代碼只是爲了讓它更像「評論」一樣。例如,只讀域,沒有刪除等

注2:這是一個通用的解決方案,所以無論我們要發表評論,哪種模式,只要加入

inlines = [CommentInline,] 

到管理類和我們很好去。

1

這是一個老問題,但我做了一個包重大啓發由Dryice劉的工作在他的答案。

該軟件包被稱爲django-admin-comments。這是很容易設置:

安裝Django管理評論:

$ pip install django-admin-comments 

將它添加到您的INSTALLED_APPS

INSTALLED_APPS = (
    ... 
    'admin_comments', 
    ... 
) 

運行數據庫遷移

$ manage.py migrate 

現在,只需添加CommentInline任何ModelAdmin

from admin_comments.admin import CommentInline 

class MyModelAdmin(admin.ModelAdmin): 
    model = MyModel 
    inlines = [CommentInline,] 

就是這樣!

拉請求歡迎,如果任何人在這個線程想成爲一個貢獻者只是打開公關添加自己的貢獻者名單,我會接受並添加你。