2016-01-09 3 views
0

У меня есть две модели, которые выглядят следующим образом:Как работает обратная функция в Django?

class Respond(models.Model): 
     id = models.AutoField(primary_key=True, unique=True) 

class Product(models.Model): 
     responde = models.ForeignKey(Responde, null=True) 
     name = models.CharField(max_length=255) 
     description = models.CharField(max_length=10, blank=True, null=True) 
     price = models.CharField(max_length=50, blank=True, null=True) 

И у меня есть форма, которая после отправки, отправить данные на удаленный сервер, а затем получить XML реагировать. У меня есть скрипт, который анализирует файлы xml или файловые объекты. Чем я сохраняю данные xml в базе данных.

class MyView(View): 

     template_name = 'myapp/form.html' 

     def get(self, request, *args, **kwargs): 
       my_form = MyForm(prefix='my_form') 
       return render(request, self.template_name, { 'my_form' : my_form }) 

     def post(self, request, *args, **kwargs): 
       my_form = MyForm(request.POST, prefix='my_form') 
       if my_form.is_valid(): 
       ## cleaned data 
       r = Respond.objects.create() 
       for xmldata in products_xml: 
        p = Product(
         name=xmldata['ProductName'], 
         description=xmldata['ProductDescription'], 
         price=xmlData['ProductPrice'], 
        ) 
        p.respond = r 
        p.save() 
       r.product_set.all() 
     return HttpResponseRedirect(reverse(respond:'result', args=(r.id))) 

После этого я хочу перенаправить на страницу, отображающую все данные сохранения из идентификатора ответа.

В моем случае есть invalid syntax ошибка reverse функция строка. Я читаю официальную документацию об этом, но я действительно не понимаю, как работает обратная функция. Мой views.py:

def result(request): 
     all_products = Products.objects.all() 
     template = get_template("booking/results.html") 
     context = Context({ 'all_products':all_products }) 
     html = template.render(context) 
     return HttpResponse(html) 

Мой urls.py выглядит следующим образом:

urlpatterns = patterns('', 
     url(r'^$', views.MyView.as_view()), 
     url(r'^(?P<respond_id>[0-9]+)/result/$', name='result'), 
) 

Помогите мне понять, как должен выглядеть обратной функции с конфигурацией URL. Спасибо.

ответ

1

Вместо этого:

return HttpResponseRedirect(reverse(respond:'result', args=(r.id))) 

Попробуйте это:

return HttpResponseRedirect(reverse('result', args=[r.id])) 
+0

Просто хочу отметить, 'Args = (r.id,)' будет работать тоже. Обратите внимание на конечную запятую. – xyres

1

Во-первых, вам не хватает реальной функции, которая должна быть вызвана в вашем urlpatterns:

urlpatterns = patterns('', 
     url(r'^$', views.MyView.as_view()), 
     url(r'^(?P<respond_id>[0-9]+)/result/$', views.result, name='result'), 
) 

Параметры для обратной функции должны быть:

reverse('result', args=['your-arguments']) 

Описано here.

Итак, вы начинаете с названия вида, которое хотите изменить, и при необходимости вы добавляете args и kwargs.

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