2015-08-08 6 views
0

Я смущен тем, как настроить/называть мой URL-адрес, чтобы передать словарь данных из моего шаблона в мое представление. Я получаю сообщение об ошибке «NoReverseMatch at/categories/academy /» Как я могу передать data_dict, который является словарем, на мой взгляд?Передать данные словаря в представление Django

template.html

<a href="{% url 'polls:request_access' data_dict %}" class="btn btn-green btn-sm"><i class="fa fa-plus"></i> Join Group</a> 

urls.py

# the category_slug in this case is "academy", see the error I mentioned above 
url(r'^categories/(?P<category_slug>[-\w]+)/request_access/$', 'request_access', name='request_access') 

views.py

def request_access(request, data): 
    print("DJANGO VIEW- THIS IS NOT PRINTING") 
    mydata = request.GET.get('data_dict') # will this work? 
    # do other stuff 
    return render(request, 'polls/categories/group_access_requested.html', 
     {'data': request}) 
+0

Откуда взялся этот data_dict? В большинстве случаев имеет смысл хранить данные в сеансе пользователя. Если вы поместите его в URL-адрес, вам нужно каким-то образом перевести словарь в параметры URL-адреса. Вы можете рассортировать/json-дамп словаря и хранить его в базе данных, а затем использовать хэш или uuid для ввода URL-адреса. 'HTTP: // пример.com/categories/foo/request_access/AD5dsf431234s52/' ' AD5dsf431234s52' затем используется как pk или уникальный пул, чтобы перестроить словарь из хранилища в вашей базе данных или что-то вроде redis. –

+0

Это похоже на ссылки, которые вы получите, когда вы нажмете «Я забыл пароль» на многих веб-страницах. URL-адрес содержит только уникальную и непознаваемую строку, связанную с некоторым значением, хранящимся на сервере. Сессионные куки в django также используют аналогичную ключевую схему. Он не хранится в URL-адресе, а в файле cookie на стороне клиента. –

+0

Большое спасибо @ HåkenLid Это отличное объяснение. Я попробую этот маршрут один раз/если мой текущий подход не сработает (попытка кодирования параметров URL) – steph

ответ

1

Попробуйте создать декоратор для выполнения кодирования data_dict.

import urllib 
from django import template 
register = template.Library() 

@register.filter 
def get_encoded_dict(data_dict): 
    return urllib.urlencode(data_dict) 

Затем внутри шаблона, вы можете использовать его как:

<a href="{% url 'polls:request_access' my_category_slug %}?{{data_dict|get_encoded_dict}}" class="btn btn-green btn-sm"><i class="fa fa-plus"></i> Join Group</a> 

Это должно решить вашу проблему.

+0

Я так близко сейчас! Теперь я вижу, что мои данные передаются в URL-адресе. Тем не менее, я получаю ошибку 404: 'Страница не найдена (404) Запроса метода: \t GET Request URL: \t HTTP: // локальные: 8000/категория/request_access/категория = Academy & профиль = jwilliams Нет Категорию матчи данный запрос. ' – steph

+0

Думаю, в вашем шаблоне вам нужно что-то вроде: ' Join Group ' –

+0

Да! Оно работает! Это замечательно - спасибо тебе много чего @animeshsharma – steph

0

Я бы рекомендовал использовать Ajax для этого. Вот пример базировать код прочь:

HTML:

# Instead of passing info through here, I would set something up in your model to handle that 
<a href="{{ object.get_some_url }} class="ajax_call" data="enter_value_here">Join Group</a> 

models.py:

class Model(models.Model): 
    field = models.ForeignKey(OtherModel) 

    def get_some_url(self): 
     return reverse('url_name', 
         kwargs={'url_argument': self.field.value}) 

АЯКС:

$('.ajax_call').click(function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     type: "POST", 
     url: "{% url 'some_url' %}", 
     data: { 
      "data_to_be_sent": $(this).attr("data"), 
      csrfmiddlewaretoken: "{{ csrf_token }}", 
     }, 
     dataType: "json", 
     success: function(data) { 
      if (data.worked) { 
       // Do something here 
      } else { 
       // Do something else here 
      } 
     }, 
     error: function (rs, e) { 
      alert('Sorry, there was an error.'); 
     } 
    }); 
}); 

views.py:

from django.http import JsonResponse 
from django.shortcuts import get_object_or_404 
from django.views.decorators.http import require_http_methods 

from datetime import datetime 


@require_http_methods(['POST']) 
def textbook(request): 
    data_received = request.POST.get('data_to_be_sent') 
    # Do something with this data 
    if something_was_done: 
     # Do something? 
     worked = True 
    else: 
     # Do something else? 
     worked = False 

    data = { 
     'worked': worked 
    } 
    return JsonResponse(data) 
+0

Благодарим вас за помощь @jape - я изначально хотел использовать Ajax, но , после многих попыток я не смог заставить его работать, поэтому я отказался от более простого подхода :( – steph

+0

Почему ответ @jape был downvoted? – steph

+0

@steph Нет проблем. Лучший подход, который вы можете предпринять, - это получить все работайте, а затем рефакторируйте и улучшайте. Не беспокойтесь о даун-голосованиях - некоторые люди воняют. Сохраните мой ответ на более поздний срок, когда вы получите более продвинутый. Пока вы выиграете от него в долгосрочной перспективе, ничего больше не имеет значения. ! – jape

0

Чтобы передать параметры URL в шаблоне, вы должны кодировать параметры, а затем прикрепить его в конце URL.

Вам нужно сделать что-то вроде:

<a href="{% url 'polls:request_access' my_category_slug %}?key1=value1&key2=value2.." class="btn btn-green btn-sm"><i class="fa fa-plus"></i> Join Group</a> 

Другой вариант заключается в использовании urllib.urlencode() из urllib библиотеки для кодирования словаря для URL-закодированные параметры. Просто передайте ему словарь, и он преобразует его в строку с кодировкой url.

In [1]: import urllib 

In [2]: data_dict = {'key1':'value1', 'key2':'value2', 'key3':'value3'} 

In [3]: urllib.urlencode(data_dict) 
Out[3]: 'key3=value3&key2=value2&key1=value1' 

Затем вы можете передать этот URL-закодированные строки в контексте, как my_url_encoded_string и поместить его в конце URL.

В ваших представлениях вы можете получить доступ к data_dict по его ключам.

value1 = request.GET.get('key1') # value of 'key1' 
value2 = request.GET.get('key2') # value of 'key2' 
+0

Я пытаюсь ваше первое предложение кодировать параметры и прикреплять их к концу URL-адреса. Продолжайте получать ошибку 'TypeError at/categories/academy/request_access /'. Я все еще пытаюсь и буду пост снова, когда/если я скоро сделаю – steph

+0

моя кнопка/ссылка: ' Join Group' – steph

+0

url: 'url (r '^ categories/(? P [- \ w] +)/request_access/$', 'request_access ', name =' request_access '), ' и первая строка вида: ' def request_access (request, parent_slug): ' – steph

Смежные вопросы