【问题标题】:Unable to show the data in django-mapbox-location-field Django无法在 django-mapbox-location-field Django 中显示数据
【发布时间】:2021-05-10 20:29:34
【问题描述】:

我希望你们都很棒! 我正在尝试这个模块 https://github.com/simon-the-shark/django-mapbox-location-field

我很困惑如何使用此模块在下面的注册表单中添加一个字段。

{% extends "base.html" %}
{% block content %}

<h1>Create Auction</h1>
<div class="wrapper">
    <form action="{% url 'auctions:create' %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {% if error_message %}<p class="error"><strong>{{ error_message }}</strong></p>{% endif %}
        <span>Enter title:</span>
        <span class="required_field" >*</span>
        <br>
        <input class="textbox" type="text" name="title">
        <br>
        <br>
        <span>Enter description:</span>
        <br>
        <input class="description_box" type="text" name="description">
        <br>
        <br>
        <span>Upload picture:</span>
        <br>
        <input class="textbox" type="file" accept="image/*" name="image">
        <br>
        <br>
        <span>Enter minimum value:</span>
        <span class="required_field" >*</span>
        <br>
        <input class="textbox" type="text" name="min_value">
        <br>
        <br>


        <input type="submit" class="submit_button" name="submit_button" value="Create">
    </form>
</div>


{% endblock %}

我试图在我的表单中添加它,但它不起作用,没有任何显示!

<form method="post"> {% csrf_token %} 
   {{form}}
   <input type="submit" value="submit"> 
</form> 
{{ form.media }}

非常感谢!

【问题讨论】:

    标签: python django django-rest-framework django-views django-forms


    【解决方案1】:

    我不知道您对 django 表单了解多少,但如果您的代码在管理面板中运行,那么我想您使用了模型字段。

    模型字段定义(可选)

    所以假设你有一个模型 Placelocation 字段。像这样的:

    class Place(models.Model):  
      location = LocationField()
    

    如果您有明显不同的设置 - 请告诉我,我们会尽力适应。但基本上你可以在必要时创建一个没有模型的表单。

    表格定义

    在这种情况下,您有 3 种不同的方式将其用作表单。

    1. 基于类的通用视图 - 方便的 django 快捷方式。基本上,您只需创建一个像这样的视图:
    class AddPlaceView(CreateView):  
        model = Place
    

    更多关于通用视图:

    1. 带有模型表单的基于功能的视图 - 根据您的模型定义模型表单,然后将其推送到视图中的上下文。
    class PlaceForm(forms.ModelForm):  
      class Meta:  
        model = Place 
        fields = "__all__"
    

    然后是视图部分

    def some_view(request):  
      form = PlaceForm()  
      return render(request, 'some_form.html', {'form': form})
    
    1. 第三种选择是具有常规形式的基于函数的视图解决方案。 - 与上述相同,但使用手动表单字段定义(不基于模型)

    HTML 部分 - django 模板

    在前面的步骤之后,您的模板上下文中应该有一个form 变量。 首先,把它记在你的脑海里:

    {% load mapbox_location_field_tags %} 
    {% location_field_includes %}
    {% include_jquery %}
    

    然后你必须渲染这个表单。您发布的代码是最简单的方法,但前提是您希望所有表单字段的最简单行为以及所有表单字段都使用 django 表单定义:

    <form method="post"> 
    {% csrf_token %} 
       {{form}}
       <input type="submit" value="submit"> 
    </form> 
    {{ form.media }}
    

    手动渲染表单 - 完整的前端控制

    Django 表单还允许您使用手动渲染功能以几乎所有您能想到的方式渲染您的字段。 您可以像这样渲染location 字段:

    {{ form.location.errors }}
    {{ form.location.label_tag }}
    {{ form.location }}
    

    不要忘记附加表单的媒体:

    {{ form.media }}
    

    一些更完整的代码html代码示例:

    {% extends "base.html" %}
    {% block content %}  
    
     {#     should be in head, but will probably work also this way #}  
     {% load mapbox_location_field_tags %}  
     {% location_field_includes %}  
     {% include_jquery %}  
     {#     #}
     
     <form method="post">  
     {% csrf_token %}  
     {#     some of your custom html    #}  
     <span>Enter title:</span>  
     <span class="required_field">*</span>  
     <br>  
     <input class="textbox" type="text" name="title">  
     <br>  
     <br>  
     <span>Enter description:</span>  
     <br>  
     <input class="description_box" type="text" name="description">  
     <br>  
     <br>  
      {#    and only one field generated with django forms mechanism    #}  
      {{ form.location.errors }}  
      {{ form.location.label_tag }}  
      {{ form.location }}  
      <input type="submit" value="submit">  
     </form> 
     {#    forms media  #}  
      {{ form.media }}  
    {% endblock %}
    

    关于 django 表单的更多信息,以及关于官方文档的手动渲染: https://docs.djangoproject.com/en/3.1/topics/forms/

    希望您会发现这个答案很有用。

    编辑:-回答第二个问题:

    您可以在 form = PlaceForm() 之后在视图函数中动态编辑属性,例如:form.fields["location"].widget.map_attrs['center'] = (0, 0) 当然,将"location" 替换为您的字段名称,将(0, 0) 替换为所需的中心地理坐标

    【讨论】:

    • 嗯,它应该可以工作。你用什么浏览器?还告诉我按钮在演示网站上是否有效:https://django-mapbox-location-field.herokuapp.com
    • 关于我的位置按钮:您应该检查浏览器开发人员工具中的 javascript 控制台输出并寻找一些警告或消息。情况可能是某些浏览器在应用程序的 GPS 位置请求是不安全的 HTTP 连接而不是 HTTPS(所以基本上总是在 localhost 上)时会阻止它。据我所知,野生动物园是这样做的
    • 您可以在 form = PlaceForm() 之后在视图函数中动态编辑属性,例如:form.fields["location"].widget.map_attrs['center'] = (0, 0) 当然,将“位置”替换为您的字段名称,将 (0, 0) 替换为所需的中心地理坐标
    • 这实际上是一个好问题,解决方案对所有 Django 表单字段都是通用的,不仅在我的包中
    • 我不知道该说什么?有用!你让我很开心 Szymon!
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2016-12-24
    • 2017-10-14
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多