python - FileField not processed on form POST -
python - FileField not processed on form POST -
when trying upload file using filefield, form doesn't post file info server. works if utilize text field, reason doesn't recognize file, doesn't show on request.files, or request.posts.
media_root , media_url configuration:
media_root = '/home/grove/pootleimages/' media_url = '/pootleimages/' get_unit_context decorator in decorators.py:
def get_unit_context(permission_codes): def wrap_f(f): @wraps(f) def decorated_f(request, uid, *args, **kwargs): unit = get_object_or_404( unit.objects.select_related("store__translation_project", "store__parent"), id=uid, ) _common_context(request, unit.store.translation_project, permission_codes) request.unit = unit request.store = unit.store request.directory = unit.store.parent homecoming f(request, unit, *args, **kwargs) homecoming decorated_f homecoming wrap_f my forms.py method:
def unit_image_form_factory(language): image_attrs = { 'lang': language.code, 'dir': language.direction, 'class': 'images expanding focusthis', 'rows': 2, 'tabindex': 15, } class unitimageform(forms.modelform): class meta: fields = ('image',) model = unit # works if using charfield! #image = forms.charfield(required=true, # label=_("image"), # widget=forms.textarea( # attrs=image_attrs)) image= forms.filefield(required=true, label=_('image'), widget=forms.fileinput( attrs=image_attrs)) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request', none) super(unitimageform, self).__init__(*args, **kwargs) def save(self): super(unitimageform, self).save() homecoming unitimageform my models.py snippet:
class unit(models.model, base.translationunit): # ... # ... # works if using textfield! #image = models.textfield(null=true, blank=true) image = models.filefield(upload_to=".", blank=true, null=true) # ... # ... my urls.py snippet:
url(r'^xhr/units/(?p<uid>[0-9]+)/image/?$', 'image', name='pootle-xhr-units-image'), my views.py method:
@require_post @ajax_required @get_unit_context('translate') def image(request, unit): """stores new image given ``unit``. :return: if form validates, cleaned image returned. error message returned otherwise. """ # update current unit instance's attributes unit.uploaded_by = request.profile unit.uploaded_on = timezone.now() language = request.translation_project.language form = unit_image_form_factory(language)(request.post, request.files, instance=unit, request=request) if form.is_valid(): form.save() context = { 'unit': unit, 'language': language, } t = loader.get_template('unit/image.html') c = requestcontext(request, context) json = {'image': t.render(c)} rcode = 200 else: json = {'msg': _("image submission failed.")} rcode = 400 response = simplejson.dumps(json) homecoming httpresponse(response, status=rcode, mimetype="application/json") my html template image upload:
<div id="upload-image"> <form enctype="multipart/form-data" method="post" action="{% url 'pootle-xhr-units-image' unit.id %}" id="image-form"> {% csrf_token %} <input type="file" name="image" id="id_image" /> <p><input type="submit" value="{% trans 'upload' %}" /></p> </form> </div> when form instantiated, request.post not homecoming file browsed user, neither request.files. form.errors returns "this field required" form object returns following:
<tr><th><label for="id_image">image:</label></th><td><ul class="errorlist"><li>this field required.</li> </ul><input lang="pl" rows="2" name="image" id="id_image" type="file" class="images expanding focusthis" dir="ltr" tabindex="15" /></td></tr> and when user clicks submit button, next post error occurs:
"post /xhr/units/74923/image http/1.1" 400 35 i bypass including required=false image property, file not posted anyway.
more output debug information:
post when filefield required=true:
status code: 400 bad request form data: csrfmiddlewaretoken: yotqpaajy74gh
form.errors:
"msg": "imagethis field required."}
if alter required=true required=false:
status code: 200 ok form data: csrfmiddlewaretoken: yotqpaajy74gh
but imagefield still doesn't show in form data.
thank you,
alex
i added gist hub containing files related problem, ease visualization:
https://gist.github.com/alex-silva/40313734b9f1cd37f204
it looks you've forgotten add together {% csrf_token %} in form. add together between tag.
or...
you can add together csrf_exempt decorator processing view:
from django.views.decorators.csrf import csrf_exempt django.http import httpresponse @csrf_exempt def my_view(request): homecoming httpresponse('hello world') more info: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
python django file upload
Comments
Post a Comment