django没有来自不同型号的反向匹配

问题描述 投票:1回答:1

当我发出以下错误时,我正在研究一个项目:

Reverse for 'project-file-delete' with arguments '('',)' not found. 1 pattern(s) tried: ['projects/(?P<pk>[0-9]+)/project\\-file/delete/$']

这是我的主要urlpattern:

urlpatterns = [
    path('', welcome_view.home, name='welcome'),
    path('projects/', include('projects.urls'))]

我的项目应用程序的urlpattern:

urlpatterns = [
    path('', ProjectListView.as_view(), name='project-home'),
    path('user_project/<str:username>/', UserProjectListView.as_view(), name='user-projects'),
    path('<int:pk>/', ProjectDetailView.as_view(), name='project-detail'),
    path('new/', ProjectCreateView.as_view(), name='project-create'),
    path('<int:pk>/update/', ProjectUpdateView.as_view(), name='project-update'),
    path('<int:pk>/delete/', ProjectDeleteView.as_view(), name='project-delete'),
    path('<int:pk>/create_base_file/', ProjectFileCreateView.as_view(), name='project-base-file'),
    path('<int:pk>/project-file/delete/', ProjectFileDeleteView.as_view(), name='project-file-delete'),
    path('<int:pk>/project_file/', views.proj_file_detail, name='project-file-detail'),
]

我的项目的模型类定义:

class Project(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    date_created = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('project-detail', kwargs={'pk': self.pk})

class ProjectFile(models.Model):
    FILE_TYPE = (
        ('base', 'Base File'),
        ('transformed', 'Transformed File'),
        ('discretized', 'Discretized File'),
        ('model', 'Model File')
    )

    file = models.FileField(upload_to='project-files', default=True)
    category = models.CharField(max_length = 50, default = 'base', choices = FILE_TYPE)
    description = models.TextField(default = 'base file')
    project = models.ForeignKey(Project, on_delete=models.CASCADE)

    def __str__(self):
        return self.description

    def get_absolute_url(self):
        return reverse('project-detail', kwargs = {'pk': self.project}) #kwargs={ 'project': self.project })

引发错误的模板:

{% block page_heading %}
<div class="d-sm-flex align-items-center justify-content-between mb-4">
    <h1 class="h3 mb-0 text-gray-800">Project's Detail</h1>
</div>
{% endblock page_heading %}

{% block content %}

<div class="jumbotron col-xl-10 col-md-6 mb-1">
    <h5>{{ object.name }}  </h5>
    <img class="img-profile rounded-circle" src="{{ user.profile.image.url }}">
    <p> {{ object.author }}</p>        
    <p> {{ object.date_created|date:"F d, Y" }}</p>
    <p> {{ object.description }}</p>
    <p> Project File(s):</p>

        <table class="table table-hover table-default">
            <thead>
                <tr>
                    <th scope="col">Filename</th>
                    <th scope="col">Classification</th>
                </tr>
            </thead>

            <tbody>
                {% for file in project_files %}
                    <tr class="table-default">
                        {% if object.author == user %}
                            <th scope="row"><a href="{% url 'project-file-detail' object.id %}">{{ file.file }} </a></th>
                        {% else %}
                            <th scope="row">{{ file.file }}</th> 
                        {% endif %}
                        <td>{{ file.category }}</td>

                        <td>
                            <a class="float-sm-right" href="{% url 'project-file-delete' object.id %}">
                                Describe File
                            </a>
                        </td>

                        <td>
                            <a class="float-sm-right" href="{% url 'project-file-delete' object.ProjectFile %}">
                                <i class="fas fa-fw fa-trash" style="font-size:16px;color:red"></i>
                            </a>
                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>


    {% if object.author == user %}
        <a class="btn btn-outline-primary btn-sm mt-1 mb-1" href="{% url 'project-base-file' object.id %}">NEXT | Upload Base File</a>
        <a class="btn btn-outline-secondary btn-sm mt-1 mb-1" href="{% url 'project-update' object.id %}">Update</a>
        <a class="btn btn-danger btn-sm mt-1 mb-1 float-sm-right" href="{% url 'project-delete' object.id %}">Delete this project</a>
    {% endif%}
</div>

{% endblock content %}

项目的详细信息视图导致错误:

class ProjectDetailView(DetailView):
model = Project
context_object_name = 'projects'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    file = ProjectFile.objects.filter(project=self.kwargs.get('pk'))
    # file = file
    context["project_files"] = file

    return context

最后我的项目文件删除视图:

class ProjectFileDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Project
    template_name = 'projects/project_file_confirm_delete.html'   # template for deletion
    success_url ='/projects/'                                     # url after successfull deletion

    # Test user permission
    def test_func(self):                            
        project = self.get_object()

        if self.request.user == project.author:
            return True
        else:
            return False
django
1个回答
0
投票

不应该这样吗?

<a class="float-sm-right" 
   href="{% url 'project-file-delete' file.file.id %}">
    Describe File
</a>

编辑

我想,你对你使用的变量名称感到困惑。最好将代码更改为下面给出的内容。

视图

project_files = ProjectFile.objects.filter(project=self.kwargs.get('pk'))
context["project_files"] = project_files

模板

{% for project_file in project_files %}
...
<th scope="row">{{ project_file.file }}</th>
...
<a class="float-sm-right" 
       href="{% url 'project-file-delete' project_file.id %}">
...
{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.