#33757: django.test.Client.post documentation is confusing --------------------------------+-------------------------------------- Reporter: bastian-wattro | Owner: nobody Type: Bug | Status: new Component: Documentation | Version: 4.0 Severity: Normal | Resolution: Keywords: | Triage Stage: Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 --------------------------------+-------------------------------------- Changes (by bastian-wattro):
* status: closed => new * resolution: invalid => Old description: > Following > [https://docs.djangoproject.com/en/4.0/topics/testing/tools/#django.test.Client.post] > with Django version 4.0.4 to write my first unit tests, I failed to > upload a file. > > As described there, I tried > {{{#!python > with open('mal.csv', 'rb') as fp: > self.client.post('/post/endpoint/', {'name': 'fred', 'attachment': fp}) > }}} > And assumed that (as described there) > > The name attachment here is not relevant; use whatever name your file- > processing code expects. > > This made the test fail. Printing request.FILES returned: > `<MultiValueDict: {'attachment': [<InMemoryUploadedFile: mal.csv > (text/csv)>]}>` > > What worked was the (way more intuitive) > {{{#!python > with open('mal.csv', 'rb') as fp: > self.client.post('/post/entpoint/', {'name': 'fred', 'attachment': fp}) > # <MultiValueDict: {'fred': [<InMemoryUploadedFile: mal.csv > (text/csv)>]}> > }}} > > I did not check: > * since when the documentation is obsolete > * if this is intended behavior New description: Following [https://docs.djangoproject.com/en/4.0/topics/testing/tools/#django.test.Client.post] with Django version 4.0.4 to write my first unit tests, I failed to upload a file under a given keyword *with the *name* / *attachment* pattern* As described there, I tried to set *name* and *file pointer* like this: > Submitting files is a special case. To POST a file, you need only provide the file field name as a key, and a file handle to the file you wish to upload as a value. For example: > {{{#!python with open('mal.csv', 'rb') as fp: self.client.post('/post/endpoint/', {'name': 'fred', 'attachment': fp}) }}} > The name *attachment* here is not relevant; use whatever name your file- processing code expects. This made me assume that the file given via the filepointer will be accessible via the keyword `fred`. This [test](https://github.com/django/django/blob/d5bc36203057627f6f7d0c6dc97b31adde6f4313/tests/file_uploads/tests.py#L86-L93) works because the [endpoint being called](https://github.com/django/django/blob/d5bc36203057627f6f7d0c6dc97b31adde6f4313/tests/file_uploads/views.py#L18) (contrary to what I would expect) checks the keyword of the file pointer (`fiel_field` in this case) and the `name` separately. What I wanted was {{{#!python with open('mal.csv', 'rb') as fp: self.client.post('/post/endpoint/', {'fred': fp}) }}} as (contraty to what is written in the docs) **name** is not required Sorry for the confusion and thanks for the quick responses. -- Comment: Sorry for the confusion and thanks for the quick responses. I'll try to clarify: Following [https://docs.djangoproject.com/en/4.0/topics/testing/tools/#django.test.Client.post the docs] with Django version 4.0.4 to write my first unit tests, I failed to upload a file under a given keyword ''with the ''name'' / ''attachment'' pattern'' The docs state: {{{#!python >>> c = Client() >>> with open('wishlist.doc', 'rb') as fp: ... c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp}) }}} > The name *attachment* here is not relevant; use whatever name your file- processing code expects. This made me assume that the file given via the file pointer will be accessible via the keyword `fred`. This [https://github.com/django/django/blob/d5bc36203057627f6f7d0c6dc97b31adde6f4313/tests/file_uploads/tests.py#L86-L93 test] works because the [https://github.com/django/django/blob/d5bc36203057627f6f7d0c6dc97b31adde6f4313/tests/file_uploads/views.py#L18 endpoint being called] (contrary to what I would expect) checks the keyword of the file pointer (`fiel_field` in this case) and the `name` separately. Reading the docs for a third time now I get the meaning. What I don't understand is why the keyword 'name' is there, and why doesn't it simply say something like: ---- To submit a file, provide a file handle to the file you wish to upload as a value. For example: {{{#!python >>> c = Client() >>> with open('wishlist.doc', 'rb') as fp: ... c.post('/customers/wishes/', {'wishes_file': fp}) }}} will be accessible via `request.FILES['wishes_file']` ---- Again thanks for your time. I get now that this is something that probably only confuses new comers like my self. -- Ticket URL: <https://code.djangoproject.com/ticket/33757#comment:3> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/0107018123c23e28-dd20ae50-978b-48e6-9d26-681973a43456-000000%40eu-central-1.amazonses.com.