Django模型表单工厂和表单 [英] Django model formset factory and forms
问题描述
我正在尝试使用Django模型格式工厂来渲染一个模板,用户可以在其中添加图像并更改他们上传的图像(非常类似于管理员可以做的)。我目前可以将模板及其正确的字段呈现给模板。我不能做的是让用户预选(想要当前登录),当我刷新页面时,图像将再次发布(不确定是否可以防止)。以下是我的代码谢谢!
型号:
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注册(请求):
user_data = User.objects.get(id = request.user.id)
ImageFormSet = modelformset_factory(Image,
fields =('user','image','link'),extra = 3)
如果request.method =='POST':
print'1'
formset = ImageFormSet(request .pOST,request.FILES,queryset = Image.objects.all())
如果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 =postaction =
enctype =multipart / form-data>
{%csrf_token%}
{{formset.management_form}}
{form for formset%}
{{form}}
{%endfor%}
< input type =submitname =submitvalue =提交/>
模型
from django.utils.text import slugify
from django.db import models
from custom_user.models import AbstractEmailUser
#用户模型
class UserModel( AbstractEmailUser)
full_name = models.CharField(max_length = 255)
def __str __(self):
return str(self.id)
#从用户实例获取图像的功能
def get_image_filename(instance,filename):
title = instance.id
slug = slugify(title)
returnuser_images /%s - %s%(slug,filename)
#使用用户实例保存图像
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,nul l = True)
在表单中只有两种形式,一种用于模型用户,另一种用于UserImages模型。
#图像表单
class ImageForm(forms.ModelForm):
image = forms.ImageField (label ='Image',required = False)
class Meta:
model = UserImages
fields =('image',)
#
class UserForm(forms.ModelForm):
full_name = forms.CharField(required = True)
class Meta:
model = UserModel
字段=('full_name','email','密码')
你可以做这样的事情
#查看
从模型导入*
从表单导入*
@csrf_protect
def post_view(request):
template ='some_template.html'
ImageFormSet = modelformset_factory(UserImages,form = ImageForm,extra = 15)
如果request.method =='POS T':
user_form = UserForm(request.POST,prefix ='form1')
formset = ImageFormSet(request.POST,request.FILES,queryset = UserImages.objects.none(),prefix =' form2')
如果user_form.is_valid()和formset.is_valid():
#保存用户表单,并获取用户ID
a = user_form.save(commit = False)
a.save()
images = formset.save(commit = False)
图像中的图像:
image.user = a
图像.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})
在模板中,您正在做正确的事情。
I'm trying to user Django model formset factory to render a template where a user can add images and change the images they have uploaded(very similar to what can be done in the admin). I currently can render the template and its correct fields to the template. What I cannot do is have the user preselected(want currently logged in) and when I refresh the page the image will be posted again(not sure if this is preventable). Below is my code. Thanks!
Model:
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)
Form:
class ImageForm(forms.ModelForm):
image = forms.ImageField(label='Image')
class Meta:
model = Image
fields = ('image',
'link',
)
View:
@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})
Template:
<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" />
let me explain the way you can do it.
MODELS
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)
In forms it's a just a two form, one for model User, other for UserImages model.
# 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',)
And in Views for post you can do something like this
# 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})
In template you are doing the right thing.
这篇关于Django模型表单工厂和表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!