如何解决包含模板中的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 举报,一经查实,本站将立刻删除。