问题
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
回答1:
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"]);
}
});
});
来源:https://stackoverflow.com/questions/60065513/passing-request-user-as-hiddeninput-while-using-html-form-in-django-ajax