Django Form не обновляет базу данных пользователей

Я хочу обновить базу данных пользователей с помощью форм. При попытке обновления база данных остается прежней и не обновляется. Как выполнить эту задачу? forms.py

from django import forms
from django.contrib.auth.models import User
class updateform(forms.ModelForm):
    class Meta:
        model=User
        fields="__all__"

views.py

from django.contrib.auth.models import User
from .forms import updateform
@permission_required('is_superuser')#only superuser can update the data base
def upform(request,id):
    emp=User.objects.get(id=id)
    if request.method=='POST':
        frm=updateform(request.POST,instance=emp)
        if frm.is_valid():
            frm.save()
            return redirect('/')
    else:
        frm=updateform(instance=emp)
    return render(request,'examp.html',{'frm':frm})

examp.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static '/examp.css' %}">
    <style>
        td,th{
        border:1px solid;
        text-align:center;
        padding:10px;
        }
    </style>
</head>
<body>
    {% include 'include/header.html' %}
    <form action="/" method="POST">
    {% csrf_token %}
    {{ frm.as_p }}
    <input type="submit" value="Submit">
</form>
</body>
</html>

Как обновить базу данных с помощью данной формы.

Почему вы не используете общие представления CBV?

в yourapp/models.py:

from django.db import models
from django.urls import reverse
from django.contrib.auth import get_user_model

# const for get_absolute_url
#that's suffix will be using in your template names look at urls.py,
#if you need u should change it for smth here and in urls!
DETAIL_SUFFIX = '_detail'

class YourModel(models.Model):
    name = models.CharField(default='new', max_length=6)
    updated_by = models.ForeignKey(get_user_model(), on_delete=models.PROTECT, 
                    related_name='get_upd_by_user')

    def __str__(self):
        return f'{self.name}'
    def get_absolute_url(self):
        return reverse(f'{self.__class__.__name__}{DETAIL_SUFFIX}', kwargs={"pk": self.pk})

Вам необходимо определить метод get_absolute_url. Тогда реверс будет работать правильно после обновления.

в yourapp/views.py:

#views
from django.views.generic.edit import UpdateView
from django.views.generic import DetailView
# AAA
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import PermissionRequiredMixin
    
class ProjectSubnetDetailView(LoginRequiredMixin, DetailView):
    model = YourModel
    template_name = 'your_name_detail.html'  
      
        

class YourNameUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
        model = YourModel
        template_name = 'your_name_edit.html'
        fields = ('somefield', )
        permission_required = ('yourapp.view_yourmodel','yourapp.change_yourmodel')
    
        def form_valid(self, form): # Bind name of current user
            form.instance.updated_by = self.request.user
            return super().form_valid(form)

Вместо декоратора @permission_required в CBV вы можете использовать PermissionRequiredMixin (настоятельно рекомендую прочитать об этом в официальной документации). Вкратце, вы должны определить только в таком порядке: (LoginRequiredMixin, PermissionRequiredMixin, UpdateView). Первое - пользователь должен быть аутентифицирован Второе - пользователь должен иметь права (или роли, которые имеют необходимые права) Третье - это ваше общее представление для выполнения чего-либо (в данном примере это обновление)

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

Вы можете определить права в панели администратора для некоторых пользователей или создать роль, определить некоторые права и добавить пользователя в эту роль. Например, я создаю пользователя и определяю ему некоторые права на просмотр и изменение таблицы: enter image description here

Так, если ваша модель называется 'YourModel', вы должны указать 'action_yourmodel'

permission_required = ('yourapp.view_yourmodel','yourapp.change_yourmodel')

в yourapp/urls.py.

from django.urls import path
from .views import YourNameUpdateViewUpdateView, YourNameDetailView

urlpatterns = [
    path('YourName/<int:pk>/edit/', YourNameUpdateView.as_view(), name='some_name_edit'),
    path('YourName/<int:pk>/detail/', YourNameDetailView.as_view(), name='some_name_detail'),
]

в yourapp/templates/ вы должны определить 2 шаблона:

#your_name_detail.html
{% extends '_basetemplate.html' %}
{% block content %}
<div>
    <p>{{ object.name }}</p>
</div>
<p>
    <a href="{{ object.get_absolute_url }}">Update</a> |
</p>
{% endblock content %}

# your_name_edit.html
{% extends '_basetemplate.html' %}
{% block content %}
    <h5>Updating {{ object.name }}</h5>
    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button class="btn btn-sm btn-info ml-2" type="submit">Update</button>
    </form>
{% endblock content %}
Вернуться на верх