Форма Django и загрузка изображений на той же странице - PullRequest
3 голосов
/ 14 мая 2011

Я пытаюсь выяснить, как загрузить изображение и получить пользовательский ввод в одной форме.Мои модели:

class Image(models.Model):
    artist = models.ForeignKey('Artist')
    image = models.ImageField(upload_to="assets/images")

class Album(models.Model):
    artist = models.ForeignKey(Artist,null=True)
    notes = models.CharField(max_length = 50)
    display = models.BooleanField()
    date_created = models.DateTimeField(auto_now_add=True)

Мои формы

class AlbumForm(forms.ModelForm):
    class Meta:
        model = Album
        fields = ('notes',)

class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
    exclude = ('artist')`

Я думаю, что мое мнение неверно, и как мне передать две формы в шаблон?Как будет выглядеть шаблон для визуализации двух форм?Я хочу использовать одну кнопку отправки.

def create(request):
    form1 = ImageForm(request.POST, request.FILES or None)
    form2= AlbumForm(request.POST or None)
    if form2.is_valid() and form1.is_valid():
        image = form1.save(commit=False)
        image.artist = Artist.objects.get(pk=3)
        image.save()
        album = form2.save(commit=False)

        album.save()
        if 'next' in request.POST:
            next = request.POST['next']
        else:
            next = reverse('art_show')
        return HttpResponseRedirect(next)
    return render_to_response(
        'art/create.html',
        {'ImageForm':form1},
        { 'AlbumForm': form2},
        context_instance = RequestContext(request)
)

1 Ответ

3 голосов
/ 14 мая 2011

Возможно, вы могли бы сделать что-то вроде этого:

<form action="." method="post" enctype="multipart/form-data">
    {{ImageForm.image}} <br />
    {{AlbumForm.notes}} <br />
    {{AlbumForm.display}} <br />
    ...
    <input type="submit" value="Save" />
</form>

Это вернет объекты form1 и form2 в вашем объекте request.POST.

views.py:

...
return render_to_response('art/create.html', 
    {'ImageForm': form1, 'AlbumForm': form2}, 
    context_instance = RequestContext(request)
)

Или вы можете сделать это:

...
return render_to_response('art/create.html',
    locals(), 
    context_instance = RequestContext(request)
)

Хотя вторая добавит все переменные, которые использует ваша функция, так что вы должны убедиться, что если вы используете ее, ваша функция не будет использовать какие-либовстроенные имена.Обычно это необычно, но вы должны просто убедиться.

РЕДАКТИРОВАТЬ: Добавлена ​​кнопка отправки, чтобы прояснить, что вам нужен только один.Также добавлен ответ просмотра.

...