gpt4 book ai didi

python - 单向删除 删除 Django Channels 线程

转载 作者:行者123 更新时间:2023-12-01 08:11:16 25 4
gpt4 key购买 nike

我正在尝试让用户能够从收件箱中删除与其他用户的对话。

我遵循了 Django Docs DeleteView,尽管这可能完全错误。

View .py

class InboxView(LoginRequiredMixin, ListView):
template_name = 'chat/inbox.html'
context_object_name = 'threads'
def get_queryset(self):
return Thread.objects.by_user(self.request.user).order_by('-timestamp')
# by_user(self.request.user)

class ThreadView(LoginRequiredMixin, FormMixin, DetailView):
template_name = 'chat/thread.html'
form_class = ComposeForm
success_url = '#'

def get_queryset(self):
return Thread.objects.by_user(self.request.user)

def get_object(self):
other_username = self.kwargs.get("username")
obj, created = Thread.objects.get_or_new(self.request.user, other_username)
if obj == None:
raise Http404
return obj

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = self.get_form()
return context

def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)

def form_valid(self, form):
thread = self.get_object()
user = self.request.user
message = form.cleaned_data.get("message")
ChatMessage.objects.create(user=user, thread=thread, message=message)
return super().form_valid(form)

class ThreadDeleteView(DeleteView):
model = Thread
success_url = reverse_lazy('inbox')

模型.py

class ThreadManager(models.Manager):
def by_user(self, user):
qlookup = Q(first=user) | Q(second=user)
qlookup2 = Q(first=user) & Q(second=user)
qs = self.get_queryset().filter(qlookup).exclude(qlookup2).distinct()
return qs

# method to grab the thread for the 2 users
def get_or_new(self, user, other_username): # get_or_create
username = user.username
if username == other_username:
return None
# looks based off of either username
qlookup1 = Q(first__username=username) & Q(second__username=other_username)
qlookup2 = Q(first__username=other_username) & Q(second__username=username)
qs = self.get_queryset().filter(qlookup1 | qlookup2).distinct()
if qs.count() == 1:
return qs.first(), False
elif qs.count() > 1:
return qs.order_by('timestamp').first(), False
else:
Klass = user.__class__
user2 = Klass.objects.get(username=other_username)
if user != user2:
obj = self.model(
first=user,
second=user2
)
obj.save()
return obj, True
return None, False

class Thread(models.Model):
first = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='chat_thread_first')
second = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='chat_thread_second')
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)

objects = ThreadManager()

def __str__(self):
return f'{self.id}'

@property
def room_group_name(self):
return f'chat_{self.id}'

def broadcast(self, msg=None):
if msg is not None:
broadcast_msg_to_chat(msg, group_name=self.room_group_name, user='admin')
return True
return False

带有删除按钮的 html 线程页面

<!-- Delete Thread -->
<form action="{% url 'chat:thread_delete' user.username %}" method='post'> {% csrf_token %}
<button type='submit' class='btn btn-light'>
<i class="fas fa-trash-alt" style="color:royalblue"></i>
</button>
</form>

url.py

app_name = 'chat'
urlpatterns = [
path('', chat_views.InboxView.as_view(), name='inbox'),
re_path(r"^(?P<username>[\w.@+-]+)", chat_views.ThreadView.as_view(), name='thread'),
re_path(r"^(?P<username>[\w.@+-]+)/delete/", chat_views.ThreadDeleteView.as_view(), name='thread_delete'),
]

我不断收到错误

TypeError at /messages/userthree/delete/ cannot unpack non-iterable NoneType object

这是由 views.py 行引起的

self.object = self.get_object()
obj, created = Thread.objects.get_or_new(self.request.user, other_username)

最佳答案

我认为这里的问题是您的 get_or_new() 方法中的 return 语句不返回元组:

if username == other_username:
return None

这会导致 View 崩溃,因为它期望将元组解包为两个变量。返回元组应该解决:

if username == other_username:
return None, None

关于python - 单向删除 删除 Django Channels 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55238955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com