2017-11-22 24 views
0

複数の画像をアップロードします。外部キーを保存するにはどうすればよいですか?

class IssuePanel(models.Model): 
    issue = models.ForeignKey(ComicIssue, on_delete=models.CASCADE) 
    panel = models.FileField(upload_to='comic_issues_files/panels/') 
    date_uploaded = models.DateTimeField(auto_now_add=True) 

githubの上のジャンゴ - multiuploadのリポジトリ上の例に従った後、私はforms.py

class PanelsForm(forms.ModelForm): 

class Meta: 

    model = ComicIssue 
    fields = ('issue', 'issue_title', 'issue_cover', 'issue_description', 'issue_cover', 'issue_file') 

panels = MultiFileField(min_num=1, max_num=20, max_file_size=2048*2048*5) 

def save(self, commit=False): 
    instance = super(PanelsForm, self).save() 
    for each in self.cleaned_data['panels']: 
     IssuePanel.objects.create(panel=each, issue=instance) 
    return instance 

views.py

class ComicIssueCreate(LoginRequiredMixin, CreateView): 
    model = ComicIssue 
    slug_field = 'comicseries_id' 
    form_class = PanelsForm 

    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.title = ComicSeries.objects.get(id=self.kwargs['pk']) 
     obj.user = self.request.user 
     obj.save() 
     return redirect('comics:series_detail', pk=obj.title.id, slug=obj.title.slug) 

urls.py

url(r'^comic/issue/(?P<pk>[0-9]+)/add/$', views.ComicIssueCreate.as_view(), name='comic-issue-add'), 
上でこれを持っています

ただし、このエラーが発生します IntegrityError NULL制約が故障していない21 /追加/ /漫画/問題/時:それはまた、エラーページ上で強調表示されているので

class ComicIssue(models.Model): 
user = models.ForeignKey(User, on_delete=models.CASCADE, 
     null=True, blank=True, verbose_name='Uploaded by: ' 
    ) 
title = models.ForeignKey(ComicSeries, on_delete=models.CASCADE, verbose_name='Series Title') 
issue = models.CharField(verbose_name='Issue Number', max_length=500) 
issue_title = models.CharField(verbose_name='Issue Title', max_length=1000) 
issue_cover = models.ImageField(verbose_name='Issue cover', upload_to='comic_issues', height_field=None, width_field=None, max_length=None) 
issue_description = models.TextField(verbose_name='Description') 
issue_file = models.FileField(verbose_name='Issue file', upload_to='comic_issues_files', max_length=100, 
    help_text='File in pdf or as single image', null=True, blank=True 
) 
date_added = models.DateTimeField(auto_now_add=True, null=True) 
is_favorite = models.BooleanField(default=False) 
issue_slug = models.SlugField(default='') 

class Meta: 

    verbose_name = 'Comic Issue' 
    verbose_name_plural = 'Comic Issues' 

def __str__(self): 
    return '{}: {} issue number - {}'.format(self.title.title, self.issue_title, self.issue) 

def save(self, *args, **kwargs): 
    self.issue_slug = slugify(self.issue_title) 
    super(ComicIssue, self).save(*args, **kwargs) 

def get_absolute_url(self): 
    return reverse('comics:issue_detail', kwargs={'issue_slug':self.issue_slug,'pk': self.pk}) 

ComicIssueモデルでこの機能が問題になる可能性があるがcomics_comicissue.title_id:

def save(self, commit=False, *args, **kwargs): 
     self.issue_slug = slugify(self.issue_title) 
     super(ComicIssue, self).save(*args, **kwargs) 

私はurlからtitle_idを渡しています。それは他のモデルでもこれだけではなく、取り組んでいます。外部キーを保存するにはどうすればよいですか?

+0

「ComicIssue」モデルを表示できますか?これがエラーの発生場所です( 'instance = super(PanelsForm、self).save()')。エラーは 'title_id'フィールドが不足していると不平を言っています。あなたのフォームには実際には定義されていません。 – dirkgroten

+0

また、注意:モデルの 'save()'メソッドに 'commit'パラメータがあってはいけません。これはModelFormsの場合のみです。 – dirkgroten

+0

title_idはURLから渡されます。このメソッドは他のビューとモデルで作業しています。 – Kariuki

答えて

0

commitの値に関係なく、フォームのsaveメソッドでフォームを保存しています。最初の行はinstance = super(PanelsForm, self).save()で、を書き込んだとしても、ComicIssueインスタンスを保存しようとします。

titleuserをフォームでinitに渡して、フォームで保存時に割り当てられるようにすることができます。またはフォームのsave方法に変更します。

def save(self, commit=False): 
    instance = super(PanelsForm, self).save(commit=commit) 
    if commit: 
     for each in self.cleaned_data['panels']: 
      IssuePanel.objects.create(panel=each, issue=instance) 
    return instance 

そして、あなたのビューは二回、フォームのsave()メソッドを呼び出す必要があるが、(、フォームのinstanceが参照によって渡されることに注意してくださいので、ビューでそれを変更することも、フォームのinstance変更) :

def form_valid(self, form): 
    obj = form.save(commit=False) 
    obj.title = ComicSeries.objects.get(id=self.kwargs['pk']) 
    obj.user = self.request.user 
    form.save() 
    return redirect('comics:series_detail', pk=obj.title.id, slug=obj.title.slug) 
+0

ありがとうございました。 – Kariuki

関連する問題