2016-10-18 5 views
1

Я пытаюсь создать фабрику форм Django для создания шаблона, где пользователь может добавлять изображения и изменять загруженные ими изображения (очень похоже на то, что можно сделать в админке). В настоящее время я могу отобразить шаблон и его правильные поля в шаблоне. То, что я не могу сделать, - это предварительный выбор пользователем (в настоящее время вошедший в систему), и когда я обновляю страницу, изображение снова будет опубликовано (не уверен, что это можно предотвратить). Ниже мой код. Благодаря!Django model formset factory and forms

Модель:

class Image(models.Model): 
    user = models.ForeignKey(User) 
    image = models.ImageField(upload_to=content_file_name, null=True, blank=True) 
    link = models.CharField(max_length=256, blank=True) 

Форма:

class ImageForm(forms.ModelForm): 
    image = forms.ImageField(label='Image') 

    class Meta: 
     model = Image 
     fields = ('image', 
        'link', 
       ) 

Вид:

@login_required 
def register(request): 

user_data = User.objects.get(id=request.user.id) 
ImageFormSet = modelformset_factory(Image, 
            fields=('user', 'image', 'link'), extra=3) 

if request.method == 'POST': 
    print '1' 
    formset = ImageFormSet(request.POST, request.FILES, queryset=Image.objects.all()) 

    if formset.is_valid(): 
     formset.user = request.user 
     formset.save() 

    return render(request, 'portal/register.html', {'formset': formset, 'user_data': user_data}) 

else: 
    print '2' 
    formset = ImageFormSet(queryset=Image.objects.all()) 
    return render(request, 'portal/register.html', {'formset': formset, 'user_data': user_data}) 

Шаблон:

<form id="" method="post" action="" 
     enctype="multipart/form-data"> 

    {% csrf_token %} 

    {{ formset.management_form }} 
    {% for form in formset %} 
     {{ form }} 
    {% endfor %} 


<input type="submit" name="submit" value="Submit" /> 

ответ

1

Позвольте мне объяснить, как вы можете это сделать.

МОДЕЛИ
from django.utils.text import slugify 
from django.db import models 
from custom_user.models import AbstractEmailUser 

# User model 
class UserModel(AbstractEmailUser): 
    full_name = models.CharField(max_length=255) 

    def __str__(self): 
     return str(self.id) 

# Function for getting images from instance of user 
def get_image_filename(instance, filename): 
    title = instance.id 
    slug = slugify(title) 
    return "user_images/%s-%s" % (slug, filename) 

# Save images with user instance 
class UserImages(models.Model): 
    user = models.ForeignKey('UserModel', db_index=True, default=None) 
    image = models.ImageField(upload_to=get_image_filename, verbose_name='Image', db_index=True, blank=True, null=True) 

В формах это только две формы, одна для модели пользователя, другой для модели UserImages.

# Images forms 
class ImageForm(forms.ModelForm): 
    image = forms.ImageField(label='Image', required=False) 

    class Meta: 
     model = UserImages 
     fields = ('image',) 

# User form 
class UserForm(forms.ModelForm): 
    full_name = forms.CharField(required=True) 

    class Meta: 
     model = UserModel 
     fields = ('full_name','email','password',) 

И в соображениях на пост вы можете сделать что-то вроде этого

# View 
from models import * 
from forms import * 

@csrf_protect 
def post_view(request): 
    template = 'some_template.html' 
    ImageFormSet = modelformset_factory(UserImages, form=ImageForm, extra=15) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, prefix='form1') 
     formset = ImageFormSet(request.POST, request.FILES, queryset=UserImages.objects.none(), prefix='form2') 

     if user_form.is_valid() and formset.is_valid(): 
      # Save User form, and get user ID 
      a = user_form.save(commit=False) 
      a.save() 

      images = formset.save(commit=False) 
      for image in images: 
       image.user = a 
       image.save() 

      return HttpResponseRedirect('/success/') 
     else: 
      user_form = UserForm(prefix='form1') 
      formset = ImageFormSet(queryset=UserImages.objects.none(), prefix='form2') 
    return render(request, template, {'form_user':user_form,'formset':formset}) 

В шаблоне вы делаете правильные вещи.

+0

Когда я пытаюсь реализовать, я продолжаю получать: error uth.User.groups: (fields.E304) Обратный аксессор для столкновений «User.groups» с обратным доступом для «UserModel.groups». \t СОВЕТ: добавьте или измените аргумент related_name в определение для «User.groups» или «UserModel.groups». auth.User.user_permissions: (fields.E304) Обратный аксессор для столкновений «User.user_permissions» с обратным доступом для «UserModel.user_permissions». – Ryan113

+0

Итак, вам нужно установить django-custom-user, а затем в settings.py добавить эту строку: AUTH_USER_MODEL = 'app.UserModel'. Эта модель перезаписывает настройки Django по умолчанию для пользователя. Дополнительная информация: https://github.com/jcugat/django-custom-user – marin