Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django python模板标记未呈现_Python_Django - Fatal编程技术网

Django python模板标记未呈现

Django python模板标记未呈现,python,django,Python,Django,首先,谢谢你,我非常感谢你提供的任何帮助 我试图从不同的应用程序在同一模板中呈现两个表单,并在同一模型中显示来自两个不同类的数据。基本上我想 将模板中每个ToolsCategory的名称显示为标题/标题 从工具应用程序的本地表单以及第二个应用程序的表单中显示表单数据,作为一种“子”表单 我以为我已经为上面的#1正确设置了模板,但是尽管有可用的数据(存储在数据库中),ToolCategories没有显示在模板中,特别是在本节中(在本问题末尾完整引用了模板): 模板html文档 {% extends

首先,谢谢你,我非常感谢你提供的任何帮助

我试图从不同的应用程序在同一模板中呈现两个表单,并在同一模型中显示来自两个不同类的数据。基本上我想

  • 将模板中每个ToolsCategory的名称显示为标题/标题
  • 从工具应用程序的本地表单以及第二个应用程序的表单中显示表单数据,作为一种“子”表单
  • 我以为我已经为上面的#1正确设置了模板,但是尽管有可用的数据(存储在数据库中),ToolCategories没有显示在模板中,特别是在本节中(在本问题末尾完整引用了模板):

    模板html文档

    {% 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>
                                        &nbsp;&nbsp;{{ 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 %}
    
  • 此外,通过如上所示在forms.py中导入model ToolCategory,可以访问类ToolsCategory字段,以便能够在forms.py中拉入表单。这使您能够从其他模型中拉入类对象(我说的对吗?)以在表单中显示。在#12中,为什么我不想在表单上显示工具所属的类别?你能澄清这两种不同形式的原因吗?这只是显示数据的另一种方式吗

  • 要连接来自不同应用程序的两个对象,必须在model.py中

  • 导入参考模型对象,然后
  • 在引用下拉列表的模型中添加一对多关系(在本例中为“工具”类别,如上面的#1所示)
  • 在对#13的引用中,为了获得视图中的对象列表,必须迭代对象并将数据附加到views.py中的forms变量(而不是我最初假设的模板)

  • 在views.py中(再次解释)


    我的回答会很长。 不幸的是,你提供的信息还不够。 然而,很明显,你同时在几个地方错了。 首先,您的模型没有以任何方式连接。 其次,HTML模板中的逻辑被破坏,表单字段被显示,随后是不相关的类别标题。 视图文件丢失,无法准确理解您在本例中试图创建的内容。 因此,我会同时举出两个例子。我希望它们会有用。请参见代码中的注释

  • 创建新的django项目
  • cd/path/to/your/django/project
  • 源路径/to/virtualenv/bin/activate#激活您的virtualenv
  • python manage.py startapp app1#启动第一个应用程序
  • python manage.py startapp app2#启动第二个应用程序
  • 编辑django project settings.py文件,添加app1和app2

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app1',
        'app2',
    ]
    
  • 现在我们有两个独立的应用程序:app1和app2。 例如,让我们将ModelToolCategory放在app1中。 编辑文件app1/models.py

    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}"
    
  • 让我们将模型工具放到app2中。但是你的模型之间没有关系。 您必须将模型工具类别中的一对多关系添加到模型工具。 编辑文件app2/models.py

    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}"
    
  • python manage.py makemigrations

  • python manage.py迁移

  • 让我们来看一下app2,它将提供url的视图、模板和路径。 编辑项目URL.py

    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),
    ]
    
  • 添加app2/forms.py 您可以使用forms.ModelForm而不是forms.Form,这样代码就会更短。 但我想展示更多细节

    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)
    
  • 编辑app2/views.py

    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})
    
  • 添加app2/url.py

    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'),
    ]
    
  • 创建目录app2/templates

  • 创建目录app2/templates/app2

  • 添加app2/templates/app2/tpl1.html

    <!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>
    
  • python manage.py测试app2 测试命令输出(我只显示了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>