70👍
You can’t capture GET parameters in the url confs, so your method is correct.
I generally prefer string formatting but it’s the same thing.
"%s?next=%s" % (reverse(name), reverse(redirect))
http://docs.djangoproject.com/en/dev/topics/http/urls/#what-the-urlconf-searches-against
The URLconf searches against the
requested URL, as a normal Python
string. This does not include GET or
POST parameters, or the domain name.
42👍
I just made my own utility function like the one asked in the question:
from django.utils.http import urlencode
def my_reverse(viewname, kwargs=None, query_kwargs=None):
"""
Custom reverse to add a query string after the url
Example usage:
url = my_reverse('my_test_url', kwargs={'pk': object.id}, query_kwargs={'next': reverse('home')})
"""
url = reverse(viewname, kwargs=kwargs)
if query_kwargs:
return f'{url}?{urlencode(query_kwargs)}'
return url
- [Django]-Django REST Framework – 405 METHOD NOT ALLOWED using SimpleRouter
- [Django]-Best practices for getting the most testing coverage with Django/Python?
- [Django]-Django: Record with max element
9👍
I think it’s better to wrap Django’s reverse method to expose this API. Here’s some simple code to do it:
from django.core.urlresolvers import reverse as django_reverse
def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None):
"""
Wrapper of django.core.urlresolvers.reverse that attaches arguments in kwargs as query string parameters
"""
if kwargs:
return '%s?%s' % (django_reverse(viewname, urlconf, args, None, prefix, current_app), \
'&'.join(['%s=%s' % (k,v) for k,v in kwargs.items()]))
else:
return django_reverse(viewname, urlconf, args, kwargs, prefix, current_app)
Put this code into some utility or common app that only depends on Django, then instead of importing django.core.urlresolvers.reverse just import myproject.myutils.urlresolvers.reverse
- [Django]-OneToOneField() vs ForeignKey() in Django
- [Django]-How to use permission_required decorators on django class-based views
- [Django]-How can I get MINIO access and secret key?
8👍
I was troubled with the same question and found this link. Apparently, your solution isn’t bad designed at all. According to the ticket discussion Django won’t provide this functionality.
You could use urlobject or furl.
The other way, is to use your own function to do this, in a much more cleaner way. Here’s the one stated in the discussion
from django.utils.http import urlencode
from django.core.urlresolvers import reverse as original_reverse
def reverse(*args, **kwargs):
get = kwargs.pop('get', {})
url = original_reverse(*args, **kwargs)
if get:
url += '?' + urlencode(get)
return url
In the question’s case, it can be used the following way
from [myfunctions] import reverse
...
reverse('login', get={next: reverse(redirect)})
- [Django]-In a django model custom save() method, how should you identify a new object?
- [Django]-Gunicorn, no module named 'myproject
- [Django]-How to access request body when using Django Rest Framework and avoid getting RawPostDataException
2👍
To keep the query optional, you can wrap Django’s reverse function with your own function that also handles the query, allowing for other proper handling of the reverse function.
Creating a Proper Request – Note that the query_kwargs
is optional, so you don’t have to send it
# from a views in views.py
def sendingView(request, truckID, fleetSlug):
#in the GET or POST
return HttpResponseRedirect(reverse('subAppName:urlViewName',
kwargs={'anyPassedKawrgs':goHere,…},
query_kwargs={'queries': goHere}
))
# from a template in specificTemplate.html
<a class="nav-link" href="{% url 'subAppName:urlViewName' kwarg1=kwarg1 kwarg2=kwarg2 … query_kwargs={'dict':here} %}">Link</a>
#from a model in models.py
class Truck(models.Model):
name = models.CharField(…)
def get_absolute_wi_url(self):
return reverse('subAppName:urlViewName', kwargs={'kwarg1':kwarg1,'kwarg2':kwarg2})
In utils.py
file (based on docs) for (1.11 and up?)
-myMainApp
-apps
-static
...
-utils
-__init__.py
-utils.py
from django.core.urlresolvers import reverse as django_reverse
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, query_kwargs=None):
"""
Wrapper of django.core.urlresolvers.reverse that attaches arguments in kwargs as query string parameters
"""
if query_kwargs:
return '%s?%s' % (django_reverse(viewname, urlconf, args, kwargs, current_app), \
'&'.join(['%s=%s' % (k,v) for k,v in query_kwargs.items()]))
else:
return django_reverse(viewname, urlconf, args, kwargs, current_app)
In the urls conf urls.py
app_name = 'subAppName'
urlpatterns = [
url(r'^(?P<kawrg1>[a-zA-Z0-9]+)/(?P<kawrg2>[a-zA-Z0-9]+)/path/to/here/$', views.urlViewFunctionName, name='urlViewName'),
And gaining access to the query
#in a view
def urlViewFunctionName(request, kwarg1, kwarg2):
if request.GET.get('submittedData'):
submittedQuery = request.GET.get('submittedData')
else:
submittedQuery = None
return render(request, 'trucks/weeklyInspectionSuccess.html', {
'truck': truck,
'submittedQuery': submittedQuery
})
#in a template
<div class="container">
Success for {{kwarg1}}
{{submittedQuery}}
</div>
- [Django]-How do I raise a Response Forbidden in django
- [Django]-How does Django's nested Meta class work?
- [Django]-Django-Admin: CharField as TextArea
0👍
Taking @chrisFrisina’s idea, the robust solution is:
from django.core import urlresolvers
from urllib.parse import urlencode
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, query_kwargs=None):
base = urlresolvers.reverse(viewname, urlconf, args, kwargs, current_app)
if query_kwargs:
query = urlencode(query_kwargs)
return f'{base}?{query}'
else:
return base
- [Django]-How to create a Django queryset filter comparing two date fields in the same model
- [Django]-On Heroku, is there danger in a Django syncdb / South migrate after the instance has already restarted with changed model code?
- [Django]-Why use Django on Google App Engine?