在Django/Ajax中使用html表单时将request.user作为hiddeninput传递 [英] Passing request.user as hiddeninput while using html form in Django/Ajax
问题描述
有没有一种方法可以在 Django
中使用 html
表单时预填充 request.user
.我的目的是要使用 User
Foreignkey
创建一个 photologue
扩展图库.
class GalleryExtended(models.Model):#链接回到Photologue的Gallery模型.gallery = models.OneToOneField(Gallery,related_name ='extended',on_delete = models.CASCADE,)user = models.ForeignKey(settings.AUTH_USER_MODEL,related_name ="galleries",default = 1,on_delete = models.CASCADE)
我使用基于类的视图/Ajax创建我的画廊
AjaxableResponseMixin类:"Mixin将AJAX支持添加到表单.必须与基于对象的FormView一起使用(例如CreateView)"def form_invalid(自我,形式):响应= super().form_invalid(form)如果self.request.is_ajax():返回JsonResponse(form.errors,status = 400)别的:返回响应def form_valid(自我,形式):#我们确保调用父级的form_valid()方法,因为#它可能会做一些处理(对于CreateView,它将#例如调用form.save().form.instance.slug = slugify(form.instance.title)form.instance.user = self.request.user打印(form.instance.user)响应= super().form_valid(form)如果self.request.is_ajax():数据= {'pk':self.object.pk,'状态':'确定'}返回JsonResponse(data)别的:返回响应类GalleryCreateView(AjaxableResponseMixin,CreateView):型号= GalleryExtendedform_class = GalleryExtendedModelFormsuccess_url = reverse_lazy('profiles:photos')
我试图初始化表格:
class GalleryExtendedModelForm(forms.ModelForm):类Meta:型号=图库扩展字段= [用户"]def __init __(self,* args,** kwargs):超级(GalleryExtendedModelForm,self).__ init __(* args,** kwargs)self.fields ['user'] = request.userself.fields ['user'].widget = HiddenInput()
并在我的模板中:
< form class ="form-group label-floating" id =相册创建表单" method ="post" enctype ="multipart/form-data">{%csrf_token%}< label class ="control-label"> {%trans'输入专辑名称'%}</label>< input class ="form-control" name ="title" id ="title" placeholder =" type ="text"></form>$('#album-create-form').submit(function(e){e.preventDefault();var serializedData = $(this).serialize();$ .ajax({输入:"POST",url:"{%url'galleries:create'%}",数据:serializedData,成功:功能(响应){$(#album-create-form").modal('hide');document.getElementById(相册创建表格").reset();$(document).ajaxStop(function(){window.location.reload();});},错误:功能(响应){//如果发生任何错误,则警告该错误alert(response ["responseJSON"] ["error"]);}});});
是否存在用于发送request.user的解决方案.谢谢
您不必为request.user创建隐藏的输入.
基于类的视图:CreateView
这会将请求用户添加到数据库的用户.
forms.py:
Django导入表单中的 从.models import GalleryExtended类GalleryExtendedModelForm(forms.ModelForm):类Meta:型号= GalleryExtended栏位= ['gallery',]
views.py:
从django.views.generic导入 导入CreateView类create_view(CreateView):success_url = reverse_lazy('profiles:photos')template_name ='app_name/template_name.html'form_class = GalleryExtendedModelFormdef form_valid(自我,形式):form.instance.user = self.request.user返回super(create_view,self).form_valid(form)
template.html:
< form method ="post" id ='相册创建格式'>{%csrf_token%}{{ 形式 }}<输入type ="submit" value =提交"></form>$('#album-create-form').submit(function(e){e.preventDefault();$ .ajax({输入:"POST",url:"{%url'galleries:create'%}",数据: {'gallery':$('#id_gallery').val()//来自表单},成功:功能(响应){$(#album-create-form").modal('hide');document.getElementById(相册创建表格").reset();$(document).ajaxStop(function(){window.location.reload();});},错误:功能(响应){//如果发生任何错误,则警告该错误alert(response ["responseJSON"] ["error"]);}});});
Is there a way to prepopulate request.user
while using html
forms in Django
. My purpose is I want to create a photologue
extended gallery with a User
Foreignkey
.
class GalleryExtended(models.Model):
# Link back to Photologue's Gallery model.
gallery = models.OneToOneField(Gallery, related_name='extended', on_delete=models.CASCADE,)
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="galleries",default=1,on_delete=models.CASCADE)
I use Class Based Views/Ajax to create my Gallery
class AjaxableResponseMixin:
"""
Mixin to add AJAX support to a form.
Must be used with an object-based FormView (e.g. CreateView)
"""
def form_invalid(self, form):
response = super().form_invalid(form)
if self.request.is_ajax():
return JsonResponse(form.errors, status=400)
else:
return response
def form_valid(self, form):
# We make sure to call the parent's form_valid() method because
# it might do some processing (in the case of CreateView, it will
# call form.save() for example).
form.instance.slug = slugify(form.instance.title)
form.instance.user = self.request.user
print(form.instance.user)
response = super().form_valid(form)
if self.request.is_ajax():
data = {
'pk': self.object.pk,
'status': 'ok'
}
return JsonResponse(data)
else:
return response
class GalleryCreateView(AjaxableResponseMixin, CreateView):
model = GalleryExtended
form_class = GalleryExtendedModelForm
success_url = reverse_lazy('profiles:photos')
I tried to initialize form:
class GalleryExtendedModelForm(forms.ModelForm):
class Meta:
model=GalleryExtended
fields = ["user"]
def __init__(self, *args, **kwargs):
super(GalleryExtendedModelForm, self).__init__(*args, **kwargs)
self.fields['user'] = request.user
self.fields['user'].widget = HiddenInput()
and in my template:
<form class="form-group label-floating" id="album-create-form" method="post" enctype="multipart/form-data">
{% csrf_token %}
<label class="control-label">{% trans 'Enter Album Name' %}</label>
<input class="form-control" name="title" id="title" placeholder="" type="text" >
</form>
$('#album-create-form').submit( function(e){
e.preventDefault();
var serializedData = $(this).serialize();
$.ajax({
type: 'POST',
url: "{% url 'galleries:create' %}",
data: serializedData,
success: function (response) {
$("#album-create-form").modal('hide');
document.getElementById("album-create-form").reset();
$(document).ajaxStop(function(){
window.location.reload();
});
},
error: function (response) {
// alert the error if any error occured
alert(response["responseJSON"]["error"]);
}
});
});
Is there a solution for sending request.user. Thanks
You don't have to create hidden input for request.user I'm giving example.
Class Based View: CreateView
This will add request user to user to database.
forms.py:
from django import forms
from .models import GalleryExtended
class GalleryExtendedModelForm(forms.ModelForm):
class Meta:
model = GalleryExtended
fields = ['gallery', ]
views.py:
from django.views.generic import CreateView
class create_view(CreateView):
success_url = reverse_lazy('profiles:photos')
template_name = 'app_name/template_name.html'
form_class = GalleryExtendedModelForm
def form_valid(self, form):
form.instance.user = self.request.user
return super(create_view, self).form_valid(form)
template.html:
<form method="post" id='album-create-form'>
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
$('#album-create-form').submit( function(e){
e.preventDefault();
$.ajax({
type: 'POST',
url: "{% url 'galleries:create' %}",
data: {
'gallery': $('#id_gallery').val() // from form
},
success: function (response) {
$("#album-create-form").modal('hide');
document.getElementById("album-create-form").reset();
$(document).ajaxStop(function(){
window.location.reload();
});
},
error: function (response) {
// alert the error if any error occured
alert(response["responseJSON"]["error"]);
}
});
});
这篇关于在Django/Ajax中使用html表单时将request.user作为hiddeninput传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!