Django中如何实现联系人表仅对所属特定用户可见
问题核心原因
你的模型设计不符合Django ORM的规范,且没有建立「联系人-所属用户」的正确关联逻辑,主要问题如下:
- 不应该在
UserContatos模型内部嵌套定义Contato模型,Django不会为嵌套模型自动建立关联关系 - 你需要的是「一个用户对应多个联系人」的一对多关联,不需要额外套一层
UserContatos模型,直接给联系人模型加用户外键即可 - 原代码中的
contatos = Contato()只是普通类属性,不会生成数据库关联字段,无法存储关联数据
修改后的实现代码
1. 模型(models.py)
from django.db import models from django.contrib.auth.models import User from django.utils import timezone # 你原来的Categoria模型保留即可,这里仅做示例补全 class Categoria(models.Model): nome = models.CharField(max_length=100) def __str__(self): return self.nome class Contato(models.Model): # 新增关联用户的外键,设置级联删除:用户删除时对应的所有联系人也删除 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="contatos") nome = models.CharField(max_length=255) sobrenome = models.CharField(max_length=255, blank=True) telefone = models.CharField(max_length=255) email = models.CharField(max_length=255, blank=True) data_criacao = models.DateTimeField(default=timezone.now) descricao = models.TextField(blank=True) categoria = models.ForeignKey(Categoria, on_delete=models.DO_NOTHING) mostrar = models.BooleanField(default=True) foto = models.ImageField(blank=True, upload_to='fotos/%y/%m/%d') def __str__(self): return self.nome
2. 表单(forms.py)
排除user字段,该字段不需要用户手动选择,我们在视图层自动绑定当前登录用户
from django import forms from .models import Contato class ContatoForm(forms.ModelForm): class Meta: model = Contato exclude = ('user',)
3. 视图层保存逻辑
提交表单时手动给联系人实例绑定当前登录用户:
from django.shortcuts import render, redirect from .forms import ContatoForm def criar_contato(request): if request.method == "POST": form = ContatoForm(request.POST, request.FILES) if form.is_valid(): # 先不提交到数据库,拿到实例对象 contato = form.save(commit=False) # 绑定当前登录用户 contato.user = request.user # 正式保存到数据库 contato.save() return redirect('contatos_list') else: form = ContatoForm() return render(request, 'criar_contato.html', {'form': form})
查询用户专属联系人
后续要获取当前用户的所有联系人,直接调用关联属性即可,不会查询到其他用户的联系人:
# 仅返回当前登录用户创建的所有联系人 contatos = request.user.contatos.all()
内容的提问来源于stack exchange,提问作者Gabriel Carvalho
相关产品推荐
相关产品推荐

