0

Wagtail 스트림 필드를 사용하여 사용자가 편집기 인터페이스에서 문서를 업로드하고 연결할 수 있습니다. 원래 필자는 설명서에서 언급 한 외래 키와 내가 본 모든 다른 예제를 사용하려고했습니다. wagtail 문서에 "set name"속성이없는 마이그레이션을 실행할 때 계속 오류가 발생했습니다. 그래서 외래 키를 사용하지 않기로 결정했습니다. 왜냐하면 이러한 문서가 반드시 우리의 목적을 위해 일대 다 관계에 관련 될 필요는 없기 때문입니다. 그래서 내 모델에서는 DocumentChooserBlocks를 사용하는 모든 필드에 외래 키를 사용하지 않으며 모든 것이 잘 작동하는 것 같습니다. 나는 "외래 키"를 오해하고 실수를 저 지르거나 나쁜 DB 디자인을 연습합니다. 다음은이 내 작업 모델 :DocumentChooserBlocks에 외래 키가 있어야합니까?

class AgendaPage(Page): 
author= models.CharField(max_length=255) 
date = models.DateField('Post date') 
mtg_date = models.DateField(default=datetime.date.today) 
mtg_time = models.CharField(max_length=255, default ='10:00 AM') 
full_video_url-models.CharField(required =False) 
###full_audio = DocumentChooserBlock(required=False) 
###mtg_transcript = DocumentChooserBlock(required=False) 
]) 
agenda = StreamField([ 
    ('agenda_item', blocks.StreamBlock([ 
     ('item_title', blocks.TextBlock()), 
     ('item_text', blocks.TextBlock()), 
     ('mtg_doc', blocks.StructBlock([ 
      ('mtg_doc_upload', DocumentChooserBlock(required=True)), 
      ('submitted_late', blocks.BooleanBlock(required=False, help_text='Submitted Late')), 
      ('heldover', blocks.BooleanBlock(required=False, help_text='Held Over')), 
      ('heldover_from', blocks.DateBlock(required=False, help_text="Held Over From")), 
     ])), 
     ('item_audio', DocumentChooserBlock(required=False)), 
    ])) 
]) 




content_panels = Page.content_panels + [ 
    FieldPanel('author'), 
    FieldPanel('date'), 
    FieldPanel('mtg_date'), 
    FieldPanel('mtg_time'), 
    StreamFieldPanel('agenda'), 

] 

또한, 모델의 두 가지 주석 처리 된 라인에서, 나는이 구문을 알고 (외래 키 없음) streamfield 내부가 아닌 DocumentChooserBlock을 위해 노력하고 있어요 모든 예제에서 볼 수 있듯이 모델 정의에서 forein 키를 정의한 다음 패널 정의에서 DocumentChooser 패널을 참조합니다. 외래 키없이 할 수 있습니까 (또는 권장) 할 수 있습니까?

답변

1

DocumentChooserBlock은 외래 키와 함께 사용되지 않습니다. 이 페이지에 문서를 첨부의 두 가지 방법이 있습니다, 당신은 하나를 선택하거나 다른 :

  • ForeignKeycontent_panelsDocumentChooserPanel로, 문서화 할 수 있습니다. 이것은 페이지에서 문서까지 일대일 또는 다 대일 관계가있을 때 사용됩니다. 예를 들어 제품에 PDF 데이터 시트가있는 ProductPage가 있습니다. 이렇게하면 데이터베이스 수준에서 두 개체 사이에 공식적인 링크가 만들어집니다.

  • StreamField (DocumentChooserBlock) 이것은 문서 링크가 페이지의 어느 위치 에나 나타날 수있는보다 유연한 배치에 사용됩니다. 데이터베이스 레벨에는 공식적인 연관성이 없습니다. 데이터베이스의 관점에서, StreamField는 단지 자유 텍스트입니다. 즉, ForeignKey가 필요하지 않습니다.

+0

외부 키가없는 스트림 필드 내에없는 DocumentChooserPanel을 어떻게 만들 수 있습니까? – JohnnyP

+1

그렇지 않습니다. 외래 키는 페이지 X가 문서 Y와 연관되어 있음을 데이터베이스가 알 수있게 해주는 것입니다. 실제로 외래 키를 사용하지 않으려면 일반 Django FileField (https : //docs.djangoproject)를 사용할 수 있습니다. FieldPanel과 함께/com/en/1.10/ref/models/fields/# django.db.models.FileField)하지만 훨씬 원시적입니다 (팝업 선택기 인터페이스가 아닌 일반 '업로드'필드 만 가져옵니다.). – gasman

+0

나는 다리에 나가서이 질문을 해보겠습니다 : 왜 하천의 문서 업로드에 외래 키가 없는게 좋을까요? 이 모든 대답은 나를 교육시키고 해결책에 가까워졌습니다. 그러나 나는 아직도 분명히 오해하고 있습니다. – JohnnyP