Джанго попробуй исключение в классе - PullRequest
0 голосов
/ 19 марта 2019

я только студент, поэтому, пожалуйста, потерпите меня.Я уже разместил другую тему по этому поводу, но в режиме просмотра.Теперь я хочу, как мне преобразовать это исключение try в представление класса, а также добавить эту форму комментария.

вот мой views.py def

def BookDetail(request, id):
    most_recent = Book.objects.order_by('-timestamp')[:3]
    book= get_object_or_404(Book, id=id)
    form = CommentForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.instance.user = request.user
            form.instance.post = book
            form.save()
            return redirect(reverse("book-detail", kwargs={
                'id': book.pk
            }))

    if request.user.is_anonymous:
        user_membership = None
    else:
        try:
            user_membership = Customer.objects.get(user=request.user)
        except Customer.DoesNotExist:
            user_membership = None

    context = {
        'user_membership': user_membership,
        'form': form,
        'book': book,
        'most_recent': most_recent,

    }
    return render(request, 'catalog/book_detail.html', context)

вот мой новый просмотр классов

class BookDetailView(NeverCacheMixin, generic.DetailView):
    model = Book

ОБНОВЛЕНИЕ ПОЧТЫ

вот мои модели.py ..

class Book(models.Model):
    slug = models.SlugField(unique=True, help_text="Enter BIC Code", null=True)
    title = models.CharField(max_length=200) #more fields after this

    timestamp = models.DateTimeField(default=timezone.now)


    activeReference = models.ManyToManyField(Membership)


    def __str__(self):
        return self.title

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

    @property
    def get_comments(self):
        return self.comments.all().order_by('-timestamp')

    @property
    def pages(self):
        return self.page_set.all()

class Page(models.Model):
    slug = models.SlugField(max_length=50)
    book = models.ForeignKey(Book, on_delete=models.SET_NULL, null=True)
    preview = models.FileField(upload_to='book_content', validators=[pdf_file_extension], help_text="PDF File Only")

    def __str__(self):
        return self.slug

    def get_absolute_url(self):
        return reverse('page-detail',
                       kwargs={
                           'book_slug': self.book.slug,
                           'page_slug': self.slug
                       })

вот мой шаблон URL

urlpatterns = [
path('', views.index, name='index'),
path('books/', views.BookListView.as_view(), name='book-list'),
path('book-detail/<slug>', views.BookDetailView.as_view(), name='book-detail'),
path('book-detail/<book_slug>/<page_slug>', views.PageDetailView.as_view(), name='page-detail'),


path('search/', views.Search, name='search'),

]

и мой book_detail.html

        {% for content in book.pages %}
            <a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
        {% endfor %}

      {% else %} 

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Если вы работаете с формами, вы должны использовать CreateView или FormView, а не DetailView.Вот пример реализации, который, как видите, немного сложен для новичка в Django:

from django.views.generic import CreateView


class BookDetailView(NeverCacheMixin, CreateView):
    form_class = CommentForm
    template_name = 'catalog/book_detail.html'

    def dispatch(self, request, *args, **kwargs):
        book_slug = self.kwargs.get('slug')  # url variables are stored in self.kwargs
        self.book = get_object_or_404(Book, slug=book_slug)  # attach book to your view
        return super().dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        # context data passed to template
        kwargs['book'] = self.book
        kwargs['most_recent'] = Book.objects.order_by('-timestamp')[:3]

        if request.user.is_anonymous:
            user_membership = None
        else:
            try:
                user_membership = Customer.objects.get(user=self.request.user)
            except Customer.DoesNotExist:
                user_membership = None
        kwargs['user_membership'] = user_membership
        return super().get_context_data(**kwargs)

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.user = self.request.user
        instance.post = self.book
        instance.save()
        return redirect(self.book.get_absolute_url())
0 голосов
/ 19 марта 2019

CBV хороши, когда вам нужно наследование или вам нужно иметь дело с разными методами HTTP, чтобы иметь один и тот же маршрут. Если это не так, FBV - лучший выбор. Тем не менее, для того, что вы пытаетесь сделать, вы должны просто FormView, который будет обрабатывать все о почте и формах.

Что-то вроде:

class BookViewSet(FormView):
form = CommentForm
template_name = 'catalog/book_detail.html'

def form_valid(self, form):
    self.send_mail(form.cleaned_data)
    return super(BookViewSet, self).form_valid(form)
...