Home > Mobile >  Django - UserEditView is missing a QuerySet?
Django - UserEditView is missing a QuerySet?

Time:03-19

trying to create an edit profile for users and i keep getting this error what should i add or change ? is my models right for UserEditView

this is my views.py (all of it edited) maybe the vendor its not compatitable with User edit view anything elses needs to be added or should i just change something all imports are for vendor and UserEditView

from tkinter import Entry
from django.contrib.auth.models import User
from xml.dom.minidom import Entity
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.urls import reverse_lazy
from django.views import generic
from django.contrib.auth.forms import UserCreationForm , UserChangeForm
from django.utils.text import slugify
from django.shortcuts import render, redirect
from .models import Profile, Vendor
from products.models import Product
from .forms import ProductForm
# Create your views here.
def become_vendor(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)

        if form.is_valid():
            user = form.save()
            login(request, user)
            vendor = Vendor.objects.create(name=user.username, created_by=user)

            return redirect('home')
    else:
        form = UserCreationForm()   

    return render(request, 'vendor/become_vendor.html', {'form': form})




@login_required
def vendor_admin(request):
   context = {
       'user':request.user

   }
   vendor = request.user.vendor
   products = vendor.products.all()
   return render(request,'vendor/vendor_admin.html',{'vendor': vendor , 'products': products ,'context':context})

@login_required
def add_house(request):
    if request.method == 'POST':
    
     form = ProductForm (request.POST, request.FILES)

     if form.is_valid():
       product = form.save(commit=False)
       product.vendor = request.user.vendor
       product.slug = slugify(product.عنوان)
       product.save()
       return redirect('vendor_admin')
    else:
        form = ProductForm()  
        return render(request,'vendor/add_house.html',{'form': form})
class UserEditView(generic.UpdateView):
    models = User
    form_class = UserChangeForm
    template_name = 'vendor/edit_profile.html'
    seccess_url = reverse_lazy('vendor_admin')
def get_object(self):
    return self.request.user

urls.py

from django.urls import path
from .import views
from .views import UserEditView
from django.contrib import admin  
from django.contrib.auth import views as auth_views

urlpattern =[
    path('signup/', views.become_vendor, name='become_vendor'),
    path('profile/', views.vendor_admin, name='vendor_admin'),
    path("logout/", auth_views.LogoutView.as_view(), name="logout"),
    path('login/', auth_views.LoginView.as_view(template_name='vendor/login.html'), name='login'),
    path('edit_profile/', UserEditView.as_view(template_name='vendor/edit_profile.html'), name='edit_profile'),
]

edit_profile.html (where the error pops up)

{% extends "base.html"%}
{% load static %}
{% block content %}
<title>title</title>
<div >
    <div >
        <div >
            <div >
                <div >
                    <div >
                        <h3 >
                            <span ></span>
                        </h3> 
<br>

<form method="post" >  
    {% csrf_token %}  
    <table>  
       {{ form.as_p }}  
        
    </table> 
    <button class='button'>Update</button>    
</form>  
</div>  
<hr>
{% endblock  content %}

CodePudding user response:

I think that you didn't declare your model correctly:

class UserEditView(generic.UpdateView):
    # models = UserChangeForm #That has no sense.
    model = User #The name of your model (Probably the default one: User).
    form_class = UserChangeForm
    template_name = 'vendor/edit_profile.html'
    success_url = reverse_lazy('vendor_admin')
    def get_object(self):
        return self.request.user

Other thing. You have declared your template name twice. According to your views.py you can delete the template_name on your urls.py:

path('edit_profile/', UserEditView.as_view(), name='edit_profile'),
  • Related