Какой должен быть правильный подход для передачи первичного ключа в URL? - PullRequest
0 голосов
/ 27 июня 2019

Сейчас я использую представление удаления на основе классов, и мой URL содержит два аргумента, которые являются первичными ключами моих двух моделей: Post и Lesson. Однако я сталкиваюсь с Attribute Error: Generic detail view LessonDeleteView must be called with either an object pk or a slug in the URLconf.

Это две мои модели Lesson и Post:

class Post(models.Model):

    title = models.CharField(max_length=100)
    image = models.ImageField(default = 'default0.jpg', upload_to='course_image/')
    description = models.TextField()
    price = models.DecimalField(decimal_places=2, max_digits=6)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    rating = models.IntegerField(default = 0)

    def __str__(self):
        return self.title

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

class Lesson(models.Model):

    title = models.CharField(max_length=100)
    file = models.FileField(upload_to="lesson/pdf")
    date_posted = models.DateTimeField(default=timezone.now)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=False, blank=False)

    def __str__(self):
        return self.title

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

Это мой URL.py:

path('post/<int:post_id>/lesson_uploaded/<int:lesson_id>', LessonDeleteView.as_view(), name='lesson_delete'),

Сейчас я пытаюсь вставить параметры в мой HTML-шаблон:

{% block content %}
<div id="main">
    <table class="table mb-0">
    <thead>
      <tr>          
        <th>Title</th>
        <th>Author</th>
        <th>Download</th>
        <th>Delete</th>
      </tr>
    </thead>
    <tbody>
      {% for l in Lesson %}
      <tr>
        <td>
            {% if l.file %}
                {{ l.title }}
            {% else %}                  
            <h6>Not available</h6>
            {% endif %}
        </td>
        <td>{{ l.post.author }}</td>
        <td>{% if l.file %}                 
            <a href="{{ l.file.url }}" class="btn btn-primary btn-sm" target="_blank">Download</a>
            {% else %}
            <h6>Not available</h6>
            {% endif %}    
        </td>
        <td> <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'lesson_delete' post.id l.id %}">Delete</a>
        </td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
</div>
{% endblock %}

Это мой взгляд на класс:

class LessonDeleteView(DeleteView):

    model = Lesson
    success_url = '../'
    template_name = 'lesson_confirm_delete.html'

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

При удалении Lesson вам не нужно указывать Post ID. Вы можете просто использовать Lesson ID здесь. Поэтому попробуйте так:

# url
path('post/lesson_uploaded/<int:pk>/', LessonDeleteView.as_view(), name='lesson_delete'),  # using pk instead of lession_id, it will resolve the error you are facing

# template
<td> <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'lesson_delete' l.id %}">Delete</a>
</td>

Обновление

из раздела комментариев, вы можете переопределить метод удаления следующим образом:

class LessonDeleteView(DeleteView):

    model = Lesson
    success_url = '../'
    template_name = 'lesson_confirm_delete.html'

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.file.delete()  # <-- added file delete code
        success_url = self.get_success_url()
        self.object.delete()
        return HttpResponseRedirect(success_url)
0 голосов
/ 27 июня 2019

Почему вы передаете идентификатор урока. Поскольку сообщение удаляется по умолчанию, урок также будет удален. Посмотрите это видео, чтобы лучше понять, как передать идентификатор и подробности об удалении просмотра.

DeleteView (представления на основе классов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...