【问题标题】:Django Rest Framework form in include template wont receive data包含模板中的 Django Rest Framework 表单不会接收数据
【发布时间】:2020-12-25 00:46:32
【问题描述】:

我在 memberform.html 模板中显示的“网络”应用程序中有一个空表单。此模板包含在另一个“内容”应用程序的索引模板中。我在模板渲染期间收到“str”对象没有属性“数据”错误

Traceback (most recent call last):
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/ml/PycharmProjects/newproject/content/views.py", line 21, in index
    return render(request, 'index.html', context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/shortcuts.py", line 36, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/loader_tags.py", line 188, in render
    return template.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 173, in render
    return self._render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/rest_framework/templatetags/rest_framework.py", line 81, in render_form
    return renderer.render(serializer.data, None, {'style': style})
AttributeError: 'str' object has no attribute 'data'

主 urls.py


    from django.contrib import admin
    from django.urls import path, include
    
    from content.views import(
        index,
    )
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', index, name='index'),
        path('', include('network.urls')),
    ]

网络/urls.py


    from django.urls import path
    from . import views
    
    app_name = 'network'
    urlpatterns = [
        path('', views.MemberForm.as_view(), name='memberform'),
    ]

network/views.py


    from django.shortcuts import render, redirect
    from network.models import Member
    from network.serializers import MemberSerializer
    from rest_framework.renderers import TemplateHTMLRenderer
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    class MemberForm(APIView):
        renderer_classes = [TemplateHTMLRenderer]
        template_name = 'memberform.html'
    
        def get(self, request):
            serializer = MemberSerializer()
            return Response({'serializer': serializer})
    
        def post(self, request):
            serializer = MemberSerializer(data=request.POST)
            if not serializer.is_valid():
                return Response({'serializer': serializer})
            serializer.save()
            return redirect('memberform')

网络/models.py


    from django.db import models
    from django.utils.translation import gettext_lazy as _
    
    # Create your models here.
    
    class Member(models.Model):
        name = models.CharField(max_length=50)
        shortbio = models.TextField()
        country = models.CharField(max_length=50)
        city = models.CharField(max_length=50)
        contactmail = models.EmailField(max_length=254)
        phonenumber = models.CharField(max_length=50)
        skills = models.CharField(max_length=50)
        otherskills = models.CharField(max_length=50)
        ongoingskills = models.CharField(max_length=50)
        cv = models.FileField()
        portfolio = models.FileField()
        web = models.URLField()
        socialmedias = models.URLField()

network/serializers.py


    from rest_framework import serializers
    from .models import Member
    
    class MemberSerializer(serializers.ModelSerializer):
        class Meta:
            model = Member
            fields = ('name', 'shortbio', 'country', 'city', 'contactmail', 'phonenumber', 'skills', 'otherskills', 'ongoingskills', 'cv', 'portfolio', 'web', 'socialmedias')

network/templates/memberform.html


    {% load rest_framework %}
    <form action="{% url 'network:memberform' %}" method="post"  enctype="multipart/form-data">
        {% csrf_token %}
        {% render_form serializer %}
        <button type="submit" class="btn btn-default">Sign in</button>
    </form>

然后尝试在这里呈现我的表单: 内容/模板/index.html


    {% extends 'base.html' %}
    
    {% load rest_framework %}
    
    {% block content %}
        {{ about }}
        {{ how }}
        {% include 'memberform.html' %}
        {{ donate }}
    {% endblock %}

内容/模板/base.html


    <!DOCTYPE html>
    <html>
        {# Make modifiable head elements #}
        <head>
            <title>{% block title %}Home {% endblock title %} | My site</title>
            {% block head_favicon %}
                <link rel="icon" type="image/png"
                      href="{{ STATIC_URL }}images/favicon.ico">
            {% endblock head_favicon %}
            {% block head_meta %}
                {% block head_meta_charset %}
                    <meta http-equiv="Content-Type"
                          content="text/html; charset=utf-8" />
                {% endblock head_meta_charset %}
                {% block head_meta_contentlanguage %}
                    <meta http-equiv="Content-Language" value="en-US" />
                {% endblock head_meta_contentlanguage %}
                {% block head_meta_viewport %}
                    <meta name="viewport"
                          content="width=device-width, initial-scale=1.0">
                {% endblock head_meta_viewport %}
            {% endblock head_meta %}
            {% block head_css %}
                {% block head_css_site %}
                    <link href="{{ STATIC_URL }}css/bootstrap.min.css"
                          rel="stylesheet" media="screen">
                    <link href="{{ STATIC_URL }}css/app.css"
                          rel="stylesheet" media="screen">
                {% endblock head_css_site %}
                {% block head_css_section %}{% endblock head_css_section %}
                {% block head_css_page %}{% endblock head_css_page %}
            {% endblock head_css %}
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
        </head>
    <body>
        {# Navigation Menu #}
        <header>
            <div class="navbar navbar-default navbar-static-top
            {% block nav-style %}{% endblock %}">
                <div class="container p-none">
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle"
                                data-toggle="collapse"
                                data-target=".navbar-collapse">
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="/">My site</a>
                    </div>
                    <div class="collapse navbar-collapse">
                        <ul class="nav navbar-nav navbar-right">
                            {% if user.is_authenticated %}
                                <li><a href="">Logout</a></li>
                                <li><a href=""
                                       class="p-r-none">Accounts</a></li>
                            {% else %}
                                <li><a href="">Login</a></li>
                                <li><a href="" class="p-r-none">Sign Up</a></li>
                            {% endif %}
                        </ul>
                    </div>
                </div>
            </div>
        </header>
        {# The Document Body #}
        <div id="site-wrapper">
            {% block content %}
            {% endblock %}
        </div>
        {# The Footer #}
        <div class="footer">
            <div class="container">
                <p></p>
            </div>
        </div>
    </body>

内容/views.py


    from django.shortcuts import render, redirect
    from django.template.loader import render_to_string
    from content.models import Post
    
    def detail(pk):
        post = Post.objects.get(pk=pk)
        context = {
            'post': post,
        }
        return render_to_string('detail.html', context)
    
    def index(request):
        about = detail(pk=1)
        how = detail(pk=2)
        donate = detail(pk=3)
        context = {
            'about': about,
            'how': how,
            'donate': donate,
        }
        return render(request, 'index.html', context)

【问题讨论】:

  • 你能否显示更多views.py和你的index.html,因为它说你的错误是return render(request, indext.html, context)
  • 我现在会尝试查找错误

标签: django django-rest-framework django-templates


【解决方案1】:

您可以执行以下操作,而不是使用 detail 函数来获取 about、how 和 donate 的值:

about = Post.objects.get(pk=1)
how = Post.objects.get(pk=2)
donate = Post.objects.get(pk=3)

这可能会根据您尝试对 detail 函数执行的操作而起作用。

【讨论】:

  • 这部分实际上工作正常,直到我在模板中添加 {% include 'memberform.html' %} 。我认为问题更多在于表单视图或序列化程序本身。
  • 在主页上,除了这个表单(使用 memberform.html),我还显示了 3 个不同的帖子(使用 detail.html)。
  • 如果我直接从主应用程序使用 urlpatterns = { path('', MemberForm.as_view(), name='memberform'), } 调用它,表单也会显示得很好
  • 我很困惑为什么你有两个 content/templates/index.html
  • 我的错,其实是base.html,我在帖子里改了
猜你喜欢
  • 2015-06-27
  • 1970-01-01
  • 2020-10-29
  • 2021-09-25
  • 2014-05-13
  • 1970-01-01
  • 2017-12-04
  • 2011-03-12
  • 2015-09-15
相关资源
最近更新 更多