首页 > 解决方案 > 基于 CreateView 和 UpdateView 的类在 Django 项目中不起作用

问题描述

我有 Django,其中有一个名为Listing的应用程序,它的模型如下,但CreateViewUpdateView没有为模型工作。
我也在使用mixins,但我已经实现了Custom User,这会导致问题吗?

  1. 出错
in get_form return form_class(**self.get_form_kwargs())
TypeError: 'ListingForm' object is not callable
  1. 任何其他用户正在更新其他人的列表,UserPassesTestMixin不起作用
import uuid
from django.db import models
from django.urls import reverse
from django.contrib.auth import get_user_model
User = get_user_model()
class Listing(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    ...other fields

创建视图

class ListingCreateView(LoginRequiredMixin, CreateView):
    model = Listing
    form_class = ListingForm()

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

更新视图

class ListingUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Listing
    form_class = ListingForm()

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

    def test_func(self):
        listing = self.get_object()
        #print(self.request.user, listing.owner)
        if(self.request.user == listing.owner):
            return True
        else:
            return False

表格.py

from django import forms
from .models import Listing


class ListingForm(forms.ModelForm):

    class Meta:
        model = Listing
        fields = ['price', 'sqft', 'acre', 'title', 'description', 'address', 'city', 'state',
                  'country', 'zipcode', 'photo_main', 'photo_1', 'photo_2', 'photo_3', 'photo_4', 'photo_5']

Tysm 提前解决!

标签: pythondjangodjango-modelsdjango-viewsdjango-forms

解决方案


您在更新和创建视图中缺少 form_class。您需要添加您的表单名称。

创建视图

class ListingCreateView(LoginRequiredMixin, CreateView):
    model = Listing
    form_class = your form name
    fields = blah blah blah
    

    def form_valid(self, form):
       form.instance.owner = self.request.user
       return super().form_valid(form)

    

更新视图

class ListingUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Listing
    form_class = your form name

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

    def test_func(self):
        listing = self.get_object()
        #print(self.request.user, listing.owner)
        if(self.request.user == listing.owner):
            return True
        else:
            return False

推荐阅读