如何让对象仅仅被他的创造者改变

2024-10-08 19:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,用户可以在其中创建一个模型地块,在该模型中,是一个将所有服务链接到该模型地块的模型。问题是Parceiros应该链接到当前用户,因为创建Parceiros对象的唯一方法是在之前登录。在此之后,唯一能够更改Parceiros字段或服务的用户应该是创建Parceiros对象的当前用户。 我已经阅读了一些问题,并尝试使用上下文处理器,但没有成功地将Parceiros链接到用户

服务/型号.py

from django.db import models
from phone_field import PhoneField
from datetime import datetime
from django.contrib.auth import get_user_model
from django.template.defaultfilters import slugify


User = get_user_model()

class Parceiros (models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    nome = models.CharField(max_length=200)
    endereco = models.TextField(max_length=400, blank=True)
    responsavel = models.CharField(max_length=100)
    tel = PhoneField(max_length=12)
    created_at = models.DateTimeField(auto_now=True)
    updated_at = models.DateTimeField(auto_now_add=True, blank=True)
    ativo = models.BooleanField(default=False)

class Servicos (models.Model):
    tipo = models.CharField(max_length=200)
    objetivo = models.TextField(max_length=500, blank=True)
    parceiro = models.ForeignKey(Parceiros, on_delete=models.CASCADE)
    preco = models.DecimalField(max_digits=9, decimal_places=2, blank=True)
    telefone = PhoneField(max_length=12, default='21968151502')

def get_image_filename(instance, filename):
    tipo = instance.services.tipo
    slug = slugify(tipo)
    return "servicos_imagens/%s-%s" % (slug, filename)

class Imagens (models.Model):
    servicos = models.ForeignKey(Servicos, on_delete=models.CASCADE)
    imagem = models.ImageField(upload_to=get_image_filename)


服务/视图.py

from django.shortcuts import render, redirect
from .models import Servicos, Parceiros, Imagens
from django.views.generic import UpdateView, DetailView, ListView
from .forms import ParceirosForm, ServicosForm, ImagensForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.context_processors import auth


def home_view(request):
    serv = Servicos.objects.all()
    context = {'serv': serv }
    return render (request, 'home.html', context)


@login_required
def parceiros_create(request):
    if request.method =='POST':
        form = ParceirosForm(request.POST)
        Parceiros.user = auth.user
        if form.is_valid():
            parceiro = form.save(commit=False)
            parceiro.save()
        return redirect('home2')
    else:
        form = ParceirosForm()
    context = {
        'form': form,
    }
    return render (request, 'parceiroform.html', context)


def parceirosview(request):
    user = Servicos.parceiro
    serv = Servicos.objects.get(parceiro=user)
    context = {'serv': serv}
    return render(request, 'parceiro.html', context)


class ServicoView(DetailView):
    model = Servicos



class ServicoUpdate(UpdateView):
    model = Servicos
    template_name = 'servicoform.html'

服务/forms.py:

from django import forms
from .models import Servicos, Imagens, Parceiros
from phone_field import PhoneField

class ParceirosForm(forms.ModelForm):
    class Meta:
        prefix = 'parceiro'
        model = Parceiros
        fields = ['nome', 'endereco', 'responsavel', 'tel']



class ServicosForm(forms.ModelForm):
    tipo = forms.CharField(max_length=200)
    objetivo = forms.CharField(max_length=500)
    preco = forms.DecimalField(max_digits=9, decimal_places=2)
    telefone = PhoneField(max_length=12)

    class Meta:
        prefix = 'service'
        model = Servicos
        fields = ['tipo', 'objetivo', 'preco', 'telefone']


class ImagensForm(forms.ModelForm):
    imagem = forms.ImageField(label='image')

    class Meta:
        model = Imagens
        fields = ['imagem']



Tags: djangofromimportmodelmodelsrequestcontextforms
1条回答
网友
1楼 · 发布于 2024-10-08 19:22:05

Parceiros是类,所以Parceiros.user = auth.user什么都不做

保存表单时,应将user分配给正在保存的模型的实际实例

if form.is_valid():
    parceiro = form.save(commit=False)
    parceiro.user = request.user  # assuming user is a FK field on Parceiros
    parceiro.save()

请注意,您应该使用当前登录的用户request.user(而不是auth.user

对于UpdateView,您只需更改queryset即可确保只能更改属于该用户的实例:

# inside class ServicoUpdate
# Servico is related to User via the Parceiros model

def get_queryset(self):
     return super().get_queryset().filter(parceiro__user=self.request.user)

# inside class ParceiroUpdate

def get_queryset(self):
     return super().get_queryset().filter(user=self.request.user)

类似地,对于需要仅对当前登录用户实例进行访问的任何其他视图,如果使用基于类的视图,则覆盖get_queryset()

相关问题 更多 >

    热门问题