/ /外部キーではなく共有UUIDによって間接的にリンクされた管理インライン-django

外部キーではなく共有UUIDによって間接的にリンクされた管理者インライン-django

投稿と添付ファイルがあります。 私の問題の原因は、添付ファイルを作成する前に添付ファイルを作成できるようにしたいことです(ユーザーは、投稿の詳細を入力する前に、豪華なAjaxアップロードウィジェットを使用して添付ファイルをアップロードするため)。私が到達した解決策は、各投稿にUUIDを与えることです。 UUIDは、投稿のモデルフォームがインスタンス化されるとき(つまり、投稿を作成する前)に生成されます。添付ファイルがアップロードされると、これらはこのUUIDに関連付けられます。質問をする前に、ここに表示するためのコードのスケッチを示します。より正確には、何が起こっているのか:

 # models.py

import uuid
from django.db import models

class Post(models.Model):
nonce = models.CharField(max_length=36)

class FooPost(Post):
body = models.TextField()

class UploadedFile(models.Model):
url = models.URLField(max_length=1024)
nonce = models.CharField(max_length=36)

@classmethod
def get_unique_nonce(cls):

while True:
nonce = str(uuid.uuid4())
if not cls.objects.filter(nonce=nonce).exists():
return nonce



class Attachment(UploadedFile):
post = models.ForeignKey(Post)

# views.py

class FooPostForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
self.initial.setdefault("uuid", UploadedFile.get_unique_uuid())

def save(self, *args, **kwargs):
obj = super(FooPostForm, self).save(*args, **kwargs)
if kwargs.get("commit", True):
for file in UploadedFile.objects.filter(nonce=obj.nonce)
Attachment(uploadedfile_ptr=file, post=obj).save_base(raw=True)
return obj

class Meta:
model = FooPost

def foo_post(request):
assert request.method == "POST"
form = FooPostForm(request.POST)
if form.is_valid():
post = form.save()
# ...

これは私のアプリではうまく機能しますが、管理インターフェースでも機能します。外部キーではなく共有ナンスによって間接的にリンクされている場合でも、投稿の管理フォームに添付ファイルをインライン化するにはどうすればよいですか?

回答:

回答№1は0

インラインのカスタムモデルフォームを提供します。

 class AttachmentForm(django.forms.ModelForm):

def save(self, *args, **kwargs):
obj = super(AttachmentForm, self).save(*args, **kwargs)
obj.nonce = self.instance.nonce
if kwargs.get("commit", True):
obj.save()
return obj

インラインからnonceフィールドを除外します。

 class AttachmentInline(admin.TabularInline):

exclude = ["nonce"]
model = Attachment
form = AttachmentForm

新しい投稿のための新しいナンスを考え出す:

 class PostAdminForm(django.forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PostAdminForm, self).__init__(*args, **kwargs)
self.initial.setdefault("nonce", S3File.get_unique_nonce())

インラインを使用します。

 # A particular kind of post
class FooPostAdmin(admin.ModelAdmin):
form = PostAdminForm
inlines = [AttachmentInline]