Django模型formset工厂和表格

时间:2016-10-18 23:41:04

标签: python django django-forms

我正在尝试使用Django模型formset工厂来渲染模板,用户可以在其中添加图像并更改他们上传的图像(非常类似于管理员可以完成的操作)。我目前可以将模板及其正确的字段呈现给模板。我不能做的是让用户预先选择(想要当前登录),当我刷新页面时,图像将再次发布(不确定这是否可以预防)。以下是我的代码。谢谢!

型号:

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 个答案:

答案 0 :(得分:3)

让我解释你能做到的方式。

模型

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})

在模板中,你做的是正确的事。