2015-01-17 2 views
4

У пользователя будут фотографии, которые будут связаны с их конкретным альбомом.Обработка нескольких форм моделей в одной форме html

Так что это была модель для этого:

class Album(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False) 
    update = models.DateTimeField(auto_now_add=False, auto_now=True) 

class Photo(models.Model): 
    photo_privacy = models.CharField(max_length=1,choices=PRIVACY, default='F') 
    user = models.ForeignKey(User) 
    caption = models.TextField() 
    image = models.ImageField(upload_to=get_upload_file_name) 
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False) 

Views.py:

def create_album(request, user_name): 
    user = User.objects.get(username=unquote(user_name)) 
    if request.method=='POST': 
     pform = AlbumPhotoForm(request.POST, request.FILES) 
     aform = AlbumForm(request.POST) 
     p_valid = pform.is_valid() 
     a_valid = aform.is_valid() 
     if p_valid and a_valid: 
      photo = pform.save(commit=False) 
      album = aform.save(commit=False) 
      photo.user = user 
      album.user = user 
      album.save() 
      photo.album = album 
      photo.save() 
      return HttpResponseRedirect('/'+user.username+'/photos') 
     else: 
      return render(request, 'create_album.html',{ 
       'pform':pform, 
       'aform':aform 
      }) 
    else: 
     pform = AlbumPhotoForm() 
     aform = AlbumForm() 
     return render(request, 'create_album.html', { 
      'pform':pform, 
      'aform':aform 
     }) 

И форма:

<form action="/{{ user.username }}/create_album/" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
    {{ aform.as_p }} 

    {{ pform.as_p }} 
    <input type="submit" value="Create and Upload Album"/> 
</form> 

Это прекрасно работает, если у меня только для загрузки один файл (фото) с этой формой.

Update:

Однако то, что я хочу сделать это, показать минимум три входа для загрузки фотографий в новый альбом:

<form action="/{{ user.username }}/create_album/" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
    {{ aform.as_p }} 

    {{ pform.as_p }} 
    {{ pform.as_p }} 
    {{ pform.as_p }} 
    <input type="submit" value="Create and Upload Album"/> 
</form> 

При этом, только последний pform это получает сохранены. А остальные два pform игнорируются. Как я могу сохранить все три формы фотографии (pform) соответственно?

Или есть какой-либо другой способ? Ваша помощь будет очень признательна! Спасибо.

ответ

4

Использование formsets. Они делают именно то, что вы хотите:

from django.forms.models import formset_factory 

PhotoFormSet = formset_factory(AlbumPhotoForm, can_delete=False, 
           min_num=1, validate_min=True, 
           max_num=3, validate_max=True, 
           extra=3) 

def create_album(request, user_name): 
    user = User.objects.get(username=unquote(user_name)) 
    if request.method=='POST': 
     form = AlbumForm(request.POST) 
     formset = PhotoFormSet(request.POST, request.FILES) 
     if all([form.is_valid(), formset.is_valid()]): 
      album = form.save(commit=False) 
      album.user = user 
      album.save() 
      for photo_form in formset: 
       if photo_form.cleaned_data: 
        photo = photo_form.save(commit=False) 
        photo.album = album 
        photo.user = user 
        photo.save() 
      return redirect('/%s/photos' % user.username) 
    else: 
     form = AlbumForm() 
     formset = PhotoFormSet() 
    return render(request, 'create_album.html', 
        {'form': form, 'formset': formset}) 

И шаблон может выглядеть следующим образом:

<form action="." method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }}  
    <table> 
     {{ formset }} 
    </table>  
    <input type="submit" value="Create and Upload Album"/> 
</form> 
+0

Привет, Я думаю, вы не получите меня. Или, может быть, я не получу тебя. Я обновил вопрос. Не могли бы вы взглянуть на него. Спасибо. – Kakar

+0

Я понимаю, что ты прав. См. Обновленный ответ. – catavaran

+0

Да !!! Ты был прав! Спасибо! Работать и понимать! – Kakar

Смежные вопросы