#27055: Model form for MultiPolygonField has invalid html
----------------------------+--------------------
Reporter: aptiko | Owner: nobody
Type: Bug | Status: new
Component: GIS | Version: 1.10
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------
== Synopsis ==
I have a model with a `MultiPolygonField`. I have Django automatically
create a form for it (using a `CreateView`). I show the form on a template
with `{{ form.as_p}}`. The result is invalid HTML; it has `<style>` inside
a `<p>`.
The reason for this is that the MultiPolygonField is rendered with a
`django.contrib.gis.forms.widgets.OpenLayersWidget`, which uses
`django/contrib/gis/templates/gis/openlayers.html`. This template contains
a `<style>` element followed by a `<div>` element. Apparently whenever
some other code elsewhere decides to show the widget, it wraps it in a
`<p>` or in a `<td>` (I've also seen it wrapped in a `<div>`).
== How to reproduce ==
1) Create or clone the minimal project.
If you prefer to clone it, it's at https://github.com/aptiko/testgishtml.
It's only three commits, of which the first two commits only contain the
empty django project and app created by `django-admin startproject` and
`./manage.py startapp`, so if you merely `git show` when you are at master
it will show you all the custom code.
If you prefer to do it manually, first `django-admin startproject
testgishtml`, then do the following:
* `./manage.py startapp gishtml`.
* Replace file `gishtml/models.py` with this:
{{{#!python
from django.contrib.gis.db import models
class Polygon(models.Model):
mpoly = models.MultiPolygonField()
}}}
* Replace `gishtml/views.py` with this:
{{{#!python
from django.views.generic import CreateView
from .models import Polygon
class CreatePolygonView(CreateView):
model = Polygon
template_name = 'create_polygon.html'
fields = ('mpoly',)
}}}
* Add file `gishtml/templates/create_polygon.html`:
{{{
<!DOCTYPE html>
<title>Create polygon</title>
{{ form.as_p }}
}}}
* Add `django.contrib.gis` and `gishtml` to `INSTALLED_APPS`.
* Add `url(r'^', gishtml.views.CreatePolygonView.as_view())` to
`urlpatterns`.
2) Run `./manage.py migrate` and `./manage.py runserver`.
3) Visit http://localhost:8000/
== Results ==
{{{
<!DOCTYPE html>
<title>Create polygon</title>
<p><label for="id_mpoly">Mpoly:</label>
<style type="text/css">
#id_mpoly_map { width: 600px; height: 400px; }
#id_mpoly_map .aligned label { float: inherit; }
#id_mpoly_div_map { position: relative; vertical-align: top; float:
left; }
#id_mpoly { display: none; }
.olControlEditingToolbar .olControlModifyFeatureItemActive {
background-image: url("/static/admin/img/gis/move_vertex_on.svg");
background-repeat: no-repeat;
}
.olControlEditingToolbar .olControlModifyFeatureItemInactive {
background-image:
url("/static/admin/img/gis/move_vertex_off.svg");
background-repeat: no-repeat;
}
</style>
<div id="id_mpoly_div_map">
<div id="id_mpoly_map"></div>
<span class="clear_features"><a
href="javascript:geodjango_mpoly.clearFeatures()">Delete all
Features</a></span>
<textarea id="id_mpoly" class="vSerializedField required" cols="150"
rows="10" name="mpoly"></textarea>
<script type="text/javascript">
var map_options = {};
var options = {
geom_name: 'MultiPolygon',
id: 'id_mpoly',
map_id: 'id_mpoly_map',
map_options: map_options,
map_srid: 4326,
name: 'mpoly'
};
var geodjango_mpoly = new MapWidget(options);
</script>
</div>
</p>
}}}
If you feed this to http://validator.w3.org/, it says "Element `style` not
allowed as child of element `p` in this context".
--
Ticket URL: <https://code.djangoproject.com/ticket/27055>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/049.b0d9b6a298a3dd552950c72a0c3f3282%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.