Django extensions for Hyperview mobile apps
python -m pip install django-hyperview
Add the app, once installed, to your INSTALLED_APPS
INSTALLED_APPS = [
...
"django_hv",
...
]
Optionally, you can add the HyperviewMiddleware
middleware to your settings.
MIDDLEWARE = [
...
"django_hv.middleware.HyperviewMiddleware",
]
As with Django, you can dynamically create your xml-based forms with this package.
from .models import Contact
from django_hv.forms import ModelForm
from django_hv import widgets
class ContactForm(ModelForm):
class Meta:
model = Contact
fields = ("first_name", "last_name", "phone_number", "email")
widgets = {
"first_name": widgets.TextField(attrs={"placeholder": "First name"}),
"last_name": widgets.TextField(attrs={"placeholder": "Last name"}),
"phone_number": widgets.TextField(attrs={"placeholder": "Phone number"}),
"email": widgets.TextField(attrs={"placeholder": "Email address"}),
}
In your view you can initiate the form as usual:
def contact_new(request):
context = {"form": ContactForm(request.POST or None)}
if request.method == "GET":
response = render(request, "new.xml", context)
elif request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
context["saved"] = True
context["contact"] = form.save()
response = render(request, "form_fields.xml", context)
return hv_repond(response)
And the xml template, you can render the form as follows:
{% load hv_tags %}
<view xmlns="https://hyperview.org/hyperview" style="edit-group">
{% if saved %}
<behavior trigger="load" once="true" action="dispatch-event" event-name="contact-updated" />
<behavior trigger="load" once="true" action="reload" href="{{ contact.detail_url }}" />
{% endif %}
{% hv_csrf_token request %}
{{ form }}
</view>
Note that you can create a CSRF token if you load the template tags of this package: {% hv_csrf_token request %}
. It needs the request
as an argument since Django requires that object to create a token.
You can use this package for your views.
from .models import Contact
from .forms import ContactForm
from django_hv.http import hv_repond
def contact_detail(request, id):
response = render(request, "show.xml", {"contact": Contact.objects.get(id=id)})
return hv_repond(response)
def contact_new(request):
...
return HyperviewResponse(request, "new.xml", context={})
For this to work, you need to add HyperviewMiddleware
to MIDDLEWARE
.
def contact_detail(request, id):
template = "show.xml" if request.hv else "show.html"
response = render(request, template, {"contact": Contact.objects.get(id=id)})
return hv_repond(response)
The property request.hv
checks if the request has a specific header that is passed by the Hypermedia client.