投稿と添付ファイルがあります。 私の問題の原因は、添付ファイルを作成する前に添付ファイルを作成できるようにしたいことです(ユーザーは、投稿の詳細を入力する前に、豪華な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]