微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

包含模板中的Django Rest Framework表单不会接收数据

如何解决包含模板中的Django Rest Framework表单不会接收数据

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

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",in render
    result = block.nodelist.render(context)
  File "/Users/ml/.virtualenvs/newproject/lib/python3.7/site-packages/django/template/base.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_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'),include('network.urls')),]

network / 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')

network / 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>

然后尝试在此处呈现我的表单: content / templates / index.html


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

content / templates / 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>

content / 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,context)

解决方法

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

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

这可能有效,具体取决于您要使用细节功能做什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?