首页 > 解决方案 > 如何更新数据库中的单个字段,django

问题描述

模型.py 文件

from django.db import models
from django.contrib.auth.models import User

class ClientDetails(models.Model):

    objects = models.Manager()
    username = models.CharField(max_length=20, unique=True)
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES)
    Mobile_no = models.IntegerField(blank=True)
    address = models.TextField(blank=True)
    online = models.BooleanField(default=True)

  def __str__(self):
       return self.username

  class Meta:
       verbose_name = 'ClientDetail'
       verbose_name_plural = 'ClientDetails'

使用此表单的forms.py 文件我正在存储用户数据用户

from django.forms import models
from django import forms
from Client.models import ClientDetails

class ClientDetailsForm(models.ModelForm):
    class Meta:
        model = ClientDetails
        fields = ['Assignment','email','username','gender', 'Mobile_no', 'address','city','Joining_branch',
                    'Work_type','candidate_job_level', 'submission_date', 'submission_time',
                    'candidate_photo', 'created_by', 'amount_paid', 'name','fix_or_custom']

AdminPanel/create_account.html此文件来自 AdminPanel/templates,它创建用户并将数据存储到ClientDeutils

<form action="{% url 'AdminPanel:fixed_target_account'%}" method="POST" 

enctype="multipart/form-data">
        {% csrf_token %}
        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-at text-black-50"></i>
                <input type="text" class="form-control text-dark" name="username" style="border:1px solid gray" placeholder="Username">
            </div>
        </div>
        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-user"></i>
                <input type="text" class="form-control text-dark" name="name" style="border:1px solid gray" placeholder="Full Name">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-genderless"></i>
                    <select class="form-control text-dark" name="gender" style="border:1px solid gray" required="" id="id_gender">
                        <option value="" selected="">---------</option>

                        <option value="Male">Male</option>

                        <option value="Female">Female</option>
                    </select>
            </div>
        </div>
        
        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-mobile-alt"></i>
                <input type="text" class="form-control text-dark" name="Mobile_no" style="border:1px solid gray" placeholder="Mobile No.">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-map-marker-alt"></i>
                <input type="text" class="form-control text-dark" name="address" style="border:1px solid gray" placeholder="Address">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon far fa-map"></i>
                <input type="text" class="form-control text-dark" name="city" style="border:1px solid gray" placeholder="City">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-code-branch"></i>
                    <select class="form-control text-dark" name="Joining_branch" style="border:1px solid gray" required="" id="id_Joining_branch">
                            <option value="" selected="">---------</option>
                            <option value="Bhandup West">Bhandup West</option>
                    </select>
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-info-circle"></i>
                    <select class="form-control text-dark" name="Work_type" style="border:1px solid gray" required="" id="id_Work_type">
                        <option value="" selected="">---------</option>
                        <option value="CopyPaste">Copy Paste</option>
                        <option value="ODT">ODT</option>
                    </select>
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-check-square"></i>
                <input type="text" class="form-control text-dark" name="candidate_job_level" style="border:1px solid gray" placeholder="Candidate job level">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-form"></i>
                    <select style="border:1px solid gray" class="form-control text-dark" name="Assignment" required="" id="id_Assignment">
                        <option value="" selected="">---------</option>

                        <option value="Assignment 1">Assignment 1</option>

                        <option value="Assignment 2">Assignment 2</option>

                        <option value="Assignment 3">Assignment 3</option>

                        <option value="Assignment 4">Assignment 4</option>

                        <option value="Assignment 5">Assignment 5</option>

                        <option value="Assignment 6">Assignment 6</option>

                    </select>
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon far fa-calendar-alt"></i>
                <input type="text" class="form-control text-dark" name="submission_date" style="border:1px solid gray" placeholder="Submission Date">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon far fa-calendar-times"></i>
                <input type="text" class="form-control text-dark" name="submission_time" style="border:1px solid gray" placeholder="Submission time">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-mail"></i>
                <input type="text" class="form-control text-dark" name="email" style="border:1px solid gray" placeholder="Email ID">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-smile"></i>
                <input type="file" class="form-control text-dark" name="candidate_photo" style="border:1px solid gray" accept="image/*" required="" id="id_candidate_photo">
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon anticon anticon-user"></i>
                <select class="form-control text-dark" name="created_by" style="border:1px solid gray" required="" id="id_created_by">
                    <option value="" selected="">---------</option>
                    <option value="1">faijan</option>
                </select>
            </div>
        </div>

        <div class='container' style="width:60%;">
            <div class="input-affix m-b-10">
                <i class="prefix-icon fas fa-rupee-sign"></i>
                <input type="text" class="form-control text-dark" name="amount_paid" style="border:1px solid gray" placeholder="Amount Paid">
            </div>
        </div>

        <select hidden name="fix_or_custom" required="" id="id_fix_or_custom">
            <option value="Fix" selected >Fix</option>
        </select>   

        <div class="text-center" style="content:50%;">
            <button class='btn btn-success btn-lg '>Create</button>
        </div>
    </form>

这个文件中的AdminPanel/views.py我成功创建了用户并存储了用户数据

def fixed_target_account(request):
    if request.method == "POST":
        form = ClientDetailsForm(request.POST, request.FILES)
        try:
            user = User.objects.create_user(request.POST['username'], password=request.POST['Mobile_no'])
            user.save()
        except IntegrityError:
            return render(request, 'AdminPanel/fixed_target_account.html', {'form':ClientDetailsForm,'error':"Username is already been taken."})
        if form.is_valid:
            newform = form.save(commit=False)
            newform.user = request.user
            newform.save()
            return redirect('AdminPanel:dashboard')
        else:
            return render(request, 'AdminPanel/fixed_target_account.html', {'form':ClientDetailsForm,'error':"Please enter the valid data."})
    else:
        pass

    return render(request, 'AdminPanel/fixed_target_account.html')

Client/Views.py 文件在这里我想当用户登录时他的在线状态应该设置为 true [即使它是]

def loginuser(request):
    ''' code for logging in the user also when logged in update staus to active '''
    if request.method == "POST":
        user = authenticate(username=request.POST['username'], password=request.POST['password'])
        login(request, user)
        # get the id of the user 
        pk = request.user.id
        ClientDetails.objects.filter(id=pk).update(online=True)
        return redirect('Client:dashboard')
    else:
        return render(request, 'Client/loginuser.html')

当他退出时,他的在线状态应该设置为 False我尝试了其他方法,但它没有更新后端的状态 [在管理员端]

def sign_out(request):
    ''' before logging out the user update his online status to False '''
    pk = request.user.id
    print(pk)
    ClientDetails.objects.filter(id=pk).update(online=False)
    logout(request)
    return render(request, 'Client/loginuser.html')

loginuser.html 文件

<div class="card-body">
        <div class="d-flex align-items-center justify-content-between m-b-30">
            <img class="img-fluid" alt="" src="{% static 'assets/images/logo/logo.png' %}">
            <h2 class="m-b-0">Sign In</h2>
        </div>
        <form action="{% url 'Client:login' %}" method="POST">
            {% csrf_token %}
            <div class="form-group">
                <label class="font-weight-semibold" for="userName">Username:</label>
                <div class="input-affix">
                    <i class="prefix-icon anticon anticon-user"></i>
                    <input type="text" class="form-control" name="username" id="userName" placeholder="Username">
                </div>
            </div>
            <div class="form-group">
                <label class="font-weight-semibold" for="password">Password:</label>
                <a class="float-right font-size-13 text-muted" href="">Forget Password?</a>
                <div class="input-affix m-b-10">
                    <i class="prefix-icon anticon anticon-lock"></i>
                    <input type="password" class="form-control" name="password" id="password" placeholder="Password">
                </div>
            </div>
            <div class="form-group">
                <div class="d-flex align-items-center justify-content-between">
                    <span class="font-size-13 text-muted">
                        Don't have an account? 
                        <a class="small" href=""> Signup</a>
                    </span>
                    <button type="submit" class="btn btn-primary">Sign In</button>
                </div>
            </div>
        </form>
    </div>

标签: djangodjango-modelsdjango-viewsdjango-templatesdjango-admin

解决方案


您的ClientDetails模型实际上并没有以任何方式链接到用于您的用户身份验证的模型。这个模型可能被称为类似 的东西User,尽管我们不能通过问题中的给定信息来确定这一点。

当您id从请求中获取当前经过身份验证的用户的 时request.user.id,这实际上是在引用一个User实例而不是一个ClientDetails实例。因此,该行ClientDetails.objects.filter(id=pk)很可能会为您提供错误的ClientDetails实例或根本没有,因此update(online=True)通常不会更新您希望它更新的实例。

因此,您要么必须将您ClientDetails的外键链接到您的User对象,然后使用该链接进行查询,或者您可以使用User实例中的用户名并在查询中使用它,如下所示ClientDetailsClientDetails.objects.filter(username=request.user.get_username())


推荐阅读