Преглед изворни кода

Simplify basket_form tag implementation

This also changes it's interface to

{% basket_form request product 'single' as basket_form %}

Before it was the weird

{% basket_form request product as basket_form single %}

However in this form the assignment_tag decorator can't be used.

Cherry-picked from
1aa64c39da
by @maikhoepfel. Docs by @maikhoepfel.

Conflicts:
	oscar/templates/oscar/catalogue/partials/add_to_basket_form_compact.html
	oscar/templatetags/basket_tags.py

Fixes #1377.
master
Markus Bertheau пре 11 година
родитељ
комит
c4846f92cd

+ 7
- 0
docs/source/releases/v0.8.rst Прегледај датотеку

@@ -304,6 +304,13 @@ Misc
304 304
   ``Product.recommended_products`` or just add the field back to your
305 305
   custom Product instance and ``ProductForm`` when migrating.
306 306
 
307
+* The ``basket_form`` template tag code has been greatly simplified. Because of
308
+  that, the syntax needed to change slightly.
309
+
310
+  Before: ``{% basket_form request product as basket_form single %}``
311
+
312
+  After: ``{% basket_form request product 'single' as basket_form %}``
313
+
307 314
 .. _rewritten: https://github.com/tangentlabs/django-oscar/commit/d8b4dbfed17be90846ea4bc47b5f7b39ad944c24
308 315
 
309 316
 Basket line stockrecords

+ 1
- 1
oscar/templates/oscar/catalogue/partials/add_to_basket_form_compact.html Прегледај датотеку

@@ -5,7 +5,7 @@
5 5
 {% purchase_info_for_product request product as session %}
6 6
 
7 7
 {% if session.availability.is_available_to_buy %}
8
-    {% basket_form request product as basket_form single %}
8
+    {% basket_form request product 'single' as basket_form %}
9 9
     <form action="{% url 'basket:add' pk=product.pk %}" method="post">
10 10
         {% csrf_token %}
11 11
         {{ basket_form.as_p }}

+ 15
- 48
oscar/templatetags/basket_tags.py Прегледај датотеку

@@ -12,52 +12,19 @@ register = template.Library()
12 12
 QNT_SINGLE, QNT_MULTIPLE = 'single', 'multiple'
13 13
 
14 14
 
15
-@register.tag(name="basket_form")
16
-def do_basket_form(parse, token):
17
-    """
18
-    Template tag for adding the add-to-basket form to the
19
-    template context so it can be rendered.
20
-    """
21
-    tokens = token.split_contents()
22
-    if len(tokens) < 4 or tokens[3] != 'as':
23
-        raise template.TemplateSyntaxError(
24
-            "%r tag uses the following syntax: "
25
-            "{%% basket_form request product_var as "
26
-            "form_var %%}" % tokens[0])
27
-
28
-    request_var, product_var, form_var = tokens[1], tokens[2], tokens[4]
29
-
30
-    quantity_type = tokens[5] if len(tokens) == 6 else QNT_MULTIPLE
31
-    if quantity_type not in (QNT_SINGLE, QNT_MULTIPLE):
32
-        raise template.TemplateSyntaxError(
33
-            "%r tag only accepts the following quantity types: "
34
-            "'single', 'multiple'" % tokens[0])
35
-    return BasketFormNode(request_var, product_var, form_var, quantity_type)
36
-
37
-
38
-class BasketFormNode(template.Node):
39
-    def __init__(self, request_var, product_var, form_var, quantity_type):
40
-        self.request_var = template.Variable(request_var)
41
-        self.product_var = template.Variable(product_var)
42
-        self.form_var = form_var
43
-        self.form_class = (AddToBasketForm if quantity_type == QNT_MULTIPLE
44
-                           else SimpleAddToBasketForm)
45
-
46
-    def render(self, context):
47
-        try:
48
-            request = self.request_var.resolve(context)
49
-            product = self.product_var.resolve(context)
50
-        except template.VariableDoesNotExist:
51
-            return ''
52
-
53
-        if not isinstance(product, Product):
54
-            return ''
55
-
56
-        initial = {}
57
-        if not product.is_group:
58
-            initial['product_id'] = product.id
59
-        form = self.form_class(
60
-            request.basket, product=product,
61
-            initial=initial)
62
-        context[self.form_var] = form
15
+@register.assignment_tag()
16
+def basket_form(request, product, quantity_type='single'):
17
+    if not isinstance(product, Product):
63 18
         return ''
19
+
20
+    initial = {}
21
+    if not product.is_group:
22
+        initial['product_id'] = product.id
23
+
24
+    form_class = AddToBasketForm
25
+    if quantity_type == QNT_SINGLE:
26
+        form_class = SimpleAddToBasketForm
27
+
28
+    form = form_class(request.basket, product=product, initial=initial)
29
+
30
+    return form

+ 1
- 1
sites/demo/templates/promotions/partials/productsingle.html Прегледај датотеку

@@ -28,7 +28,7 @@
28 28
                 <a class="btn btn-large" href="{% url 'catalogue:detail' product.slug product.id %}">{% trans "View range" %}</a>
29 29
             {% else %}
30 30
                 {% if session.availability.is_available_to_buy %}
31
-                    {% basket_form request product as basket_form single %}
31
+                    {% basket_form request product 'single' as basket_form %}
32 32
                     <form action="{% url 'basket:add' %}" method="post">
33 33
                         {% csrf_token %}
34 34
                         {{ basket_form.as_p }}

Loading…
Откажи
Сачувај