2017-08-09 9 views
2

は私のモデルですDjangoのadminに新しいインラインを追加することができますは編集できませんが、ここで

class Note(): 
    note = models.TextField(null=False, blank=False, editable=True) 
    user = models.ForeignKey(to=User, null=True, blank=True) 

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey("content_type", "object_id") 

そして、私は任意の管理者に組み込むには、このモデルを作成し、インラインは、私は必要なもの

class NoteInline(GenericTabularInline): 
    model = Note 
    extra = 0 

を下回っていますここでは、現在のすべてのノートを表示したいが、ログインしたユーザーがそれらのノートを編集しないようにしたい。現時点では、ユーザーは古いものを編集して新しいものを追加することができます。だから私がしたことはここにあります。

class NoteInline(GenericTabularInline): 
    model = Note 
    extra = 0 

    def get_readonly_fields(self, request, obj=None): 
     if obj and 'change' in request.resolver_match.url_name: 
      return ['note', 'user', ] 
     else: 
      return [] 

しかし、ユーザーが新しいメモを追加すると、無効な(編集不可の)メモテキストが表示されます。しかし、ユーザーは編集可能ではない古いフィールドを見ることができます。

この機能を実装するにはどうすればよいですか?

+0

この目的のために

は、私はそれが最初のデータを有しているインスタンスが変更された場合、検証エラーを発生させforms.pyでNoteFormを作成しましたこのようなものが動作します。「追加」ビューと「変更」ビューに異なるインラインが追加されていますか? https://djangosnippets.org/snippets/3084/ – tdsymonds

+0

これでは、インラインを部分的に読み取り専用にしたり、部分的に編集したりすることはできません(ノートのインライン追加)。ここに私がしたことが2つの新しいインラインに分かれています。ここでうまく説明されているhttps://stackoverflow.com/a/28149575/1439913 –

答えて

0

私は同じ質問をしています。

ただし、インラインのフィールドが「読み取り専用」であるかどうかは気にしません。一度作成されると変更したくないだけです。

class NoteForm(forms.ModelForm): 
    def clean(self): 
     if self.has_changed() and self.initial: 
      raise ValidationError(
       'You cannot change this inline', 
       code='Forbidden' 
      ) 
     return super().clean() 

    class Meta(object): 
     model = Note 
     fields='__all__' 

admin.py::おそらく

class NoteInline(GenericTabularInline): 
    model = Note 
    extra = 0 
    form = NoteForm 
関連する問題