2011-10-05 37 views
0

我有帖子和附件。我的問題的根源在於,我希望可以在創建附件之前創建附件(因爲用戶在填寫帖子的詳細信息之前使用花哨的Ajax上傳小部件上傳附件)。我得到的解決方案是給每個帖子一個UUID。 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() 
     # ... 

這種運作良好,在我的應用程序,但我想它也是在管理界面工作。如何在帖子的管理員表單中嵌入附件,即使它們是通過共享的隨機數間接鏈接而不是通過外鍵鏈接的?

回答

0

爲內聯提供自定義的ModelForm:

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 

從內嵌排除現時領域:

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]