Noob_Coder
Noob_Coder

Reputation: 23

CreateView and UpdateView based class are not working in Django Project

I have Django in Which there is app called Listing and it's model as follows but CreateView and UpdateView are not woking for model.
I am also using mixins but I have implemented Custom User , so is that cuases a problem?

  1. getting error
in get_form return form_class(**self.get_form_kwargs())
TypeError: 'ListingForm' object is not callable
  1. Any other user is updating listing of others, UserPassesTestMixin not working
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

CreateView

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)

UpdateView

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

forms.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 for solving in advance!

Upvotes: 0

Views: 410

Answers (1)

boyenec
boyenec

Reputation: 1637

You are missing form_class in your update and create view. You need to be add your forms name.

CreateView

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)

    

UpdateView

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

Upvotes: 1

Related Questions