【问题标题】:Delete an object by id with django使用 django 按 id 删除对象
【发布时间】:2017-03-22 17:56:20
【问题描述】:

从事学校项目。我正在尝试仅删除已登录并创建消息的人的消息。我希望其他用户看到它们,但只有创建者可以删除它。我有代码将删除数据库中的所有内容。我研究并发现 Mysecret.objects.filter(id=request.session['user_id']).delete() 应该可以工作,但是当我这样做时,页面不会删除任何内容,只会刷新页面。

我只会发布视图和模型,因为我知道其他一切都有效。我认为它只是我似乎无法确定的格式。

所以我现在得到的是我的消息 ID,即 secret.id,我有创建者 ID,即 secret.creator.id 和会话 ID request.session['user_id']。 我如何比较它们以仅删除该消息

Views.py 

from django.shortcuts import render, redirect
from . models import Mysecret
from ..logReg.models import User


# Create your views here.

def index(request):
    context = {

    "secret": Mysecret.objects.all(),

    }

    return render(request, 'secretdojo/index.html', context)


def create(request):
    secreteid= User.objects.get(id=request.session['user_id'])

    Mysecret.objects.create( secret=request.POST['message'], creator=secreteid)

    return redirect( 'secretdojo:index')

def removesecret(request):


    Mysecret.objects.filter(id=request.session['user_id']).delete()



    return redirect( 'secretdojo:index')


def topsecret(request):
    context = {


    }

    return redirect( '/')

model.py 


from __future__ import unicode_literals
from django.db import models
from ..logReg.models import User

class Mysecret(models.Model):
    secret = models.CharField(max_length =500)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    loguser = models.ManyToManyField(User, related_name='loguser')
    creator = models.ForeignKey(User, related_name='creator')

User模型的foreignKey部分:

class User(models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    email = models.CharField(max_length = 100)
    password = models.CharField(max_length =100)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    objects = UserManager()

【问题讨论】:

  • 请也发布我的秘密模型
  • 如果creator 包含创建者,那么您为什么要将用户与id 进行比较?
  • ta是我的秘密模特
  • 因为 id 仅在另一个 def 中,我没有跟进。至少当我尝试它坏了

标签: django python-2.7


【解决方案1】:

你应该是这样的:

Mysecret.objects.filter(creator=request.user).delete()

【讨论】:

  • @DavidHollenbeck :如果您使用 Django Auth.. 或进行相应的更改,它会正常工作。
【解决方案2】:

建议:不要保留自己的User模型,而是使用Django's Authentication system

就您的代码而言,我相信您“创建”代码也不起作用,这是因为Mysecret.objects.filter(id=request.session['user_id']) 这一行。因为这不会返回任何东西。您正在模型 Mysecret 中搜索,但使用用户 ID,它不会返回任何内容。相反,您需要:

 Mysecret.objects.filter(creator=request.session['user_id'])

如果您使用 Danjgo 的 Auth,您将拥有 request.user 并且可以执行以下操作:

 Mysecret.objects.filter(creator=request.user)

另一个注意事项: Mysecret 模型有loguser 字段的原因是什么?对于您的情况,这似乎是多余的,

【讨论】:

  • 它是多对多的登录用户,以便以后添加更多应用程序。并且您上面的方法不会中断但不会删除只是刷新页面。
  • 请尝试通过打印Mysecret.objects.filter(creator=request.session['user_id']) 的值来调试,看看它返回了什么。如果它返回 None,那么您的查询不起作用。您确定将您的用户 ID 存储在会话中吗?
  • 我知道我得到了 id,因为我让他们当前在我的 html 中打印 Id 用户 ID 消息 课程名称 日期 添加操作 24 1 这是一个测试,我希望它在 2017 年 3 月 22 日有效, 上午 10:50 删除 25 1 2017 年 3 月 22 日上午 11:12 删除 26 1 2017 年 3 月 22 日上午 11:16 删除
  • 您能否尝试在视图中打印查询结果并查看日志以查看打印的内容?
【解决方案3】:

删除创建者创建的所有消息

Mysecret.objects.filter(creator=request.session['user_id']).delete()

按 id 且仅由其创建者删除消息

例如:假设 secret_id 是消息的 id

Mysecret.objects.filter(creator=request.session['user_id'],id =secret_id ).delete()

【讨论】:

    【解决方案4】:

    答案如下。

    mainid = Mysecret.objects.get(id=id)
    userid =User.objects.get(id=request.session['user_id'])
    
    if mainid.creator != userid:
        return False
    mainid.delete()
    
     <td>{{ dog.created_at }}</td>
                    {% if dog.creator.id == request.session.user_id %}
                    <td><form action="{% url 'secretdojo:remove' id=dog.id %}">{% csrf_token %}<input class="btn btn-default" type="submit" value="Remove"></form></td> 
                    {% endif %}
                </tr>
                {% endfor %}
            </table>
    

    【讨论】:

      【解决方案5】:

      按 id 从会话购物车中删除特定产品:

      ` def DeleteProductView(request,id):

      cart = request.session.get('cart')
      product = Product.objects.get(id=id)
      var = str(product.id)
      if request.method == 'POST':
          request.session.modified = True
          cart.pop(var)`
      

      【讨论】:

        猜你喜欢
        • 2018-11-13
        • 1970-01-01
        • 2017-01-04
        • 2019-01-23
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        相关资源
        最近更新 更多