0

Scribbleモデルに複数の画像を追加できるようにしたい。そのため、ScribbleMediaを別のモデルに入れて、外部キーとして使用できるようにします。次に、django Formsetを使用して、1つのScribbleモデルに複数のファイルを追加できるようにします。

これまで見てきた例では、複数のScribbleモデルを作成できますが、1つのScribbleに複数のFileFieldを追加する方法がわかりません。

コードは次のとおりです。

Models.py

class Scribble(models.Model):
         body = models.TextField()
         user = models.ForeignKey(User)
         def __unicode__(self):
          return u'%s, %s' % (self.user.username, self.media)

def get_file_path(instance, filename):
      ext = filename.split('.')[-1]
      filename = "%s.%s" % (uuid.uuid4(), ext)
      return os.path.join('scribblemedia/', filename)

class ScribbleMedia(models.Model):
     media = models.FileField(upload_to=get_file_path)
     scribble=models.ForeignKey(Scribble)
     def __unicode__(self):
      return self.media

forms.py

class ScribbleSaveForm(forms.Form):
    media=forms.FileField(
      label=u'add file',
      required=False,
      widget=forms.FileInput()
    )
    body=forms.CharField(
      label=u'description',
      widget=forms.Textarea()
    )

views.py

def scribbler_save_page(request):
    if request.method == 'POST':
        form = ScribbleSaveForm(request.POST, request.FILES)
        if form.is_valid():
            #Create or get media.
            media, dummy = ScribbleMedia.objects.get_or_create(
                media=form.cleaned_data['media']
            )
            #Create or get media.
            scribble, created=Scribble.objects.get_or_create(
                user=request.user,
                media=media
            )
            #update scribble body
            scribble.body=form.cleaned_data['body']
            # Save scribble to database.
            scribble.save()
            return HttpResponseRedirect ( 
                '/user/%s/' % request.user.username
            )
    else:
        form = ScribbleSaveForm()
    variables = RequestContext (request, { 
        'form': form
    })
    return render_to_response ('scribble_save.html', variables)

scribble_save.html

{% extends "base.html" %}
    {% block title %}Save Scribble {% endblock %}
    {% block head %}Save Scribble {% endblock %}
    {% block content %}
    <form enctype="multipart/form-data" method="post" action=".">
        {{ form.as_p }}
        <input type="submit" value="save" />
        {% csrf_token %}
    </form>
    {% endblock %}
4

1 に答える 1

0

まず、モデル構造が間違っています。1 つの ScribbleMedia に複数の Scribble を含めることができます。これは、必要なものとは逆です。ForeignKey を ScribbleMedia モデルに移動して、Scribble を指すようにします。

次に、お気づきのとおり、これはインライン formsetの正確な使用例です。あなたはそれでどんな問題を抱えているのか正確には言いませんが、ドキュメントは明確でなければなりません.あなたの場合のインラインモデルには単一のフィールド(ファイルフィールドmedia)しかないので、1つのスクリブルに複数のファイルを追加していません.複数の ScribbleMedias (それぞれが 1 つの FileField を持つ) を 1 つの Scribble に追加しています。

于 2012-08-19T21:22:06.190 に答える