Usage
Usage in templates
Including various Django templates based on the experiment variant:
jobs/xyz.html
{% if request.google_optimize.redesign == "new_design" %}
{% include "jobs/xyz_new.html" %}
{% else %}
{% include "jobs/xyz_old.html" %}
{% endif %}
Or you can use django-google-optimize
inline:
<nav class="navbar navbar-expand-lg navbar-dark
{% if request.google_optimize.redesign == "new_design" %}navbar-redesign{% endif %}
">
Usage in views
To display two different templates based on the experiment variant:
def get_template_names(self):
variant = self.request.google_optimize.get("redesign", None)
if variant == "new":
return ["jobs/xyz_new.html"]
return ["jobs/xyz_old.html"]
Adjust the queryset based on the experiment variant:
def get_queryset(self):
variant = self.request.google_optimize.get("redesign", None)
if variant == "new":
qs = qs.exclude(design__contains="old")
Forcing a specific experiment variant in tests
If you want to test a specific feature you are A/B testing you can force a
specific variant during the request lifecycle. You can use the context manager
override_google_optimize()
to modify the context of the request in tests.
from django_google_optimize.middleware import override_google_optimize
# As a context manager
def test_feature_a(client):
with override_google_optimize({"feature_a": "true"}):
response = client.get("/my-view")
assert response.context["request"].google_optimize == {"feature_a": "true"}
# As a decorator
@override_google_optimize({"feature_a": "true"})
def test_feature_a_decorator(client):
response = client.get("/my-view")
assert response.context["request"].google_optimize == {"feature_a": "true"}