Django python模板标记未呈现
首先,谢谢你,我非常感谢你提供的任何帮助 我试图从不同的应用程序在同一模板中呈现两个表单,并在同一模型中显示来自两个不同类的数据。基本上我想Django python模板标记未呈现,python,django,Python,Django,首先,谢谢你,我非常感谢你提供的任何帮助 我试图从不同的应用程序在同一模板中呈现两个表单,并在同一模型中显示来自两个不同类的数据。基本上我想 将模板中每个ToolsCategory的名称显示为标题/标题 从工具应用程序的本地表单以及第二个应用程序的表单中显示表单数据,作为一种“子”表单 我以为我已经为上面的#1正确设置了模板,但是尽管有可用的数据(存储在数据库中),ToolCategories没有显示在模板中,特别是在本节中(在本问题末尾完整引用了模板): 模板html文档 {% extends
{% extends '../account/account_base.html' %}
{% load static %}
{% block content %}
<div class="bg-light">
<div class="container space-1">
<div class="mb-9">
<h2 class="h4">
<a href="{% url 'tools_list' %}"><br/> Tools</a> {{ tool.name }}
</h2>
<h6><a href="{% url 'tools_list' %}"><< BACK to the Tools list</a></h6>
</div>
<div class="row justify-content-between align-items-center mb-4">
<form action="" method="post" class="form-group">
{% csrf_token %}
{{ form.non_field_errors }}
{% if form.tool.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}
<p>Now Editing Tool Details for: {{ tool.name }}</p>
<div class="js-focus-state input-group mb-2">
<div class="input-group-prepend">
<span class="input-group-text">
<span class="fas fa-puzzle-piece"> Name</span>
</span>
</div>
{{ form.name }}
</div>
<div class="js-focus-state input-group mb-2">
<div class="input-group-prepend">
<span class="input-group-text">
<span class="fas fa-cogs"> Description</span>
</span>
{{ form.description }}</div>
</div>
<div class="js-focus-state input-group mb-2">
<div class="input-group-prepend">
<span class="input-group-text">
<span class="fas fa-calculator">Version</span>
</span>
{{ form.version }}
</div>
</div>
<div class="js-focus-state input-group mb-2">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">
<span class="fas fa-file"> Archived? </span>
</span>
{{ form.is_archived }}
</div>
</div>
</div>
{% for cat in tool_categories %}
<h2>{{ cat.name }}</h2>
{% endfor %}
<button name="submit" type="submit" class="btn btn-primary transition-3d-hover">Update</button>
<a href="{% url 'view_tool' tool.id %}">
<button name="button" type="button" class="btn btn-primary transition-3d-hover">View Only
</button>
</a>
<a href="{% url 'delete_confirm' tool.id %}">
<button name="button" type="button" class="btn btn-danger transition-3d-hover"
onclick="return confirm('Are you sure you want to delete this tool?')">Delete
</button>
</a>
<a href="{% url 'delete' tool.id %}">
<button name="button" type="button" class="btn btn-danger transition-3d-hover">Delete - NO
CONFIRMATION
</button>
</a>
</form>
</div>
</div>
</div>
{% endblock content %}
我的回答会很长。 不幸的是,你提供的信息还不够。 然而,很明显,你同时在几个地方错了。 首先,您的模型没有以任何方式连接。 其次,HTML模板中的逻辑被破坏,表单字段被显示,随后是不相关的类别标题。 视图文件丢失,无法准确理解您在本例中试图创建的内容。 因此,我会同时举出两个例子。我希望它们会有用。请参见代码中的注释
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1',
'app2',
]
from django.db import models
class ToolCategory(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=200, blank=True)
class Meta:
verbose_name_plural = "Tool Categories"
def __str__(self):
# return str(self.name) + str(self.description)
return f"{self.name}, {self.description}" # this is more pretty, I think
from django.db import models
from app1.models import ToolCategory # you have to import model ToolCategory
class Tool(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=200, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
version = models.DecimalField(max_length=6, max_digits=6, decimal_places=2)
is_archived = models.BooleanField(default=False)
tool_category = models.ForeignKey(to=ToolCategory, on_delete=models.CASCADE, null=False) # adding OneToMany relation
def __str__(self):
# return str(self.name) # you may change this on your flavor
return f"{self.name}/{self.tool_category.name}"
from django.db import models
class ToolCategory(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=200, blank=True)
class Meta:
verbose_name_plural = "Tool Categories"
def __str__(self):
# return str(self.name) + str(self.description)
return f"{self.name}, {self.description}" # this is more pretty, I think
from django.db import models
from app1.models import ToolCategory # you have to import model ToolCategory
class Tool(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=200, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)
version = models.DecimalField(max_length=6, max_digits=6, decimal_places=2)
is_archived = models.BooleanField(default=False)
tool_category = models.ForeignKey(to=ToolCategory, on_delete=models.CASCADE, null=False) # adding OneToMany relation
def __str__(self):
# return str(self.name) # you may change this on your flavor
return f"{self.name}/{self.tool_category.name}"
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('app2/', include('app2.urls'), ), # http://your.site:port/app2/... will switches control to app2/urls.py
path('admin/', admin.site.urls),
]
from django import forms
from app1.models import ToolCategory
class EditToolForm(forms.Form):
"""
this form uses fields from both models: app1.models.ToolCategory and app2.models.Tool
"""
name = forms.CharField(max_length=200)
description = forms.CharField(max_length=200, required=False)
version = forms.DecimalField(max_digits=6, decimal_places=2)
is_archived = forms.BooleanField(initial=False)
tool_category = forms.ModelChoiceField(queryset=ToolCategory.objects.all())
class YourToolForm(forms.Form):
"""
this form uses fields from model app2.models.Tool only, categories from app1 will be added in app2.views.YourView
"""
name = forms.CharField(max_length=200)
description = forms.CharField(max_length=200, required=False)
version = forms.DecimalField(max_digits=6, decimal_places=2)
is_archived = forms.BooleanField(initial=False)
from django.shortcuts import render
from django.views.generic import View
from app1.models import ToolCategory
from .models import Tool
from .forms import EditToolForm, YourToolForm
class MyView(View):
"""
Tools editing view
"""
def get(self, request):
tools = Tool.objects.all()
forms = []
for tool in tools:
form = EditToolForm(
initial={
'name': tool.name,
'description': tool.description,
'version': tool.version,
'is_archived': tool.is_archived,
'tool_category': tool.tool_category,
}
)
forms.append(form)
return render(request, f"{__package__}/tpl1.html", {'forms': forms})
class YourView(View):
"""
Tools editing view grouped by ToolCategory
"""
def get(self, request):
categories = ToolCategory.objects.all()
categories_list = []
for category in categories:
category_dict = {'name': category.name, 'forms': []}
tools = category.tool_set.all()
for tool in tools:
category_dict['forms'].append(
YourToolForm(
initial={
'name': tool.name,
'description': tool.description,
'version': tool.version,
'is_archived': tool.is_archived,
}
)
)
categories_list.append(category_dict)
return render(request, f"{__package__}/tpl2.html", {'categories': categories_list})
from django.urls import path
from .views import MyView, YourView
app_name = __package__
urlpatterns = [
path('my/', MyView.as_view(), name='my_view'),
path('your/', YourView.as_view(), name='your_view'),
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% for form in forms %}
<form>
{{ form.as_p }}
</form>
{% endfor %}
</body>
</html>
你好
姓名:
说明:
版本:
已存档:
工具类别:
---------
第1类,第1类
第二类,第二类
姓名:
说明:
版本:
已存档:
工具类别:
---------
第1类,第1类
第二类,第二类
姓名:
说明:
版本:
已存档:
工具类别:
---------
第1类,第1类
第二类,第二类
你好
第一类
姓名:
说明:
版本:
已存档:
姓名:
说明:
版本:
已存档:
第二类
姓名:
说明:
版本:
已存档:
非常感谢你在这方面的帮助!!我修改了问题的底部,因为我不能在这里全部打字。我只想澄清几个问题,但这对于django项目中所有视图、模型和表单如何在应用程序之间交互非常有启发性!!
from django.urls import path
from .views import MyView, YourView
app_name = __package__
urlpatterns = [
path('my/', MyView.as_view(), name='my_view'),
path('your/', YourView.as_view(), name='your_view'),
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% for form in forms %}
<form>
{{ form.as_p }}
</form>
{% endfor %}
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% for category in categories %}
<div>
<h2>{{ category.name }}</h2>
{% for form in category.forms %}
{{ form.as_p }}
{% endfor %}
</div>
{% endfor %}
</body>
</html>
from django.test import TestCase
from django.test import Client
from django.shortcuts import reverse
from app1.models import ToolCategory
from .models import Tool
class Test1(TestCase):
client_class = Client
def setUp(self) -> None:
# create first tool category
category1 = ToolCategory(name='cat1', description='cat desc1')
category1.save()
# create second tool category
category2 = ToolCategory(name='cat2', description='cat desc2')
category2.save()
# create tools
t1 = Tool(name='t1', description='t1 desc', version='1.1', tool_category=category1)
t1.save()
t2 = Tool(name='t2', description='t2 desc', version='1.2', tool_category=category1)
t2.save()
t3 = Tool(name='t3', description='t3 desc', version='1.5', tool_category=category2)
t3.save()
def test_my_view(self):
response = self.client.get(reverse(f'{__package__}:my_view')) # makes test request to my_view
print(response.content.decode())
def test_your_vies(self):
response = self.client.get(reverse(f'{__package__}:your_view')) # makes test request to your_view
print(response.content.decode())
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<form>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t1" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t1 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.10" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
<p><label for="id_tool_category">Tool category:</label> <select name="tool_category" required id="id_tool_category">
<option value="">---------</option>
<option value="1" selected>cat1, cat desc1</option>
<option value="2">cat2, cat desc2</option>
</select></p>
</form>
<form>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t2" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t2 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.20" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
<p><label for="id_tool_category">Tool category:</label> <select name="tool_category" required id="id_tool_category">
<option value="">---------</option>
<option value="1" selected>cat1, cat desc1</option>
<option value="2">cat2, cat desc2</option>
</select></p>
</form>
<form>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t3" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t3 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.50" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
<p><label for="id_tool_category">Tool category:</label> <select name="tool_category" required id="id_tool_category">
<option value="">---------</option>
<option value="1">cat1, cat desc1</option>
<option value="2" selected>cat2, cat desc2</option>
</select></p>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<div>
<h2>cat1</h2>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t1" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t1 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.10" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t2" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t2 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.20" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
</div>
<div>
<h2>cat2</h2>
<p><label for="id_name">Name:</label> <input type="text" name="name" value="t3" maxlength="200" required id="id_name"></p>
<p><label for="id_description">Description:</label> <input type="text" name="description" value="t3 desc" maxlength="200" id="id_description"></p>
<p><label for="id_version">Version:</label> <input type="number" name="version" value="1.50" step="0.01" required id="id_version"></p>
<p><label for="id_is_archived">Is archived:</label> <input type="checkbox" name="is_archived" required id="id_is_archived"></p>
</div>
</body>
</html>