2017-02-23 33 views
-1

我正在學習Django,並挑戰自己創建一個小型票務系統作爲研究案例。獲取當前登錄的用戶並將其設置爲模型|上的默認用戶Django + Python3

完成了一些事情,但現在我有一個小問題。

如何當我保存「Ticket」時,Django獲取當前登錄的用戶並將其設置爲我的票證模型中的「usuario」字段的默認值?

這是我models.py文件:

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

class Projeto(models.Model): 
    """ 
     Classe que gere os Projetos 
     Permite que se cadastre N usuários por Projeto 
     Retorna: 
      NOME_DO_PROJETO | SITE_DO_PROJETO 
    """ 
    nome = models.CharField(max_length=100) 
    site = models.CharField(max_length=200) 
    informacoes = models.TextField(blank=True) 
    usuarios = models.ManyToManyField(User, related_name='projetos') 

    def __str__(self): 
     return self.nome + " | " + self.site 

class Ticket(models.Model): 
    """ 
     Classe que gere os Tickets no sistema. 
     Retorna: 
      DATA HORA | TITULO DO CHAMADO 
    """ 
    TIPOS_TICKET = (
     ('BUG', 'Bug'), 
     ('URGENTE', 'Urgente'), 
     ('FINANCEIRO', 'Financeiro'), 
     ('MELHORIA', 'Melhoria') 
    ) 
    STATUS_TICKET = (
     ('ABERTO', 'Aberto'), 
     ('AGUARDANDO_CLIENTE', 'Aguardando Cliente'), 
     ('EM_ANALISE', 'Em Análise'), 
     ('FINALIZADO', 'Finalizado'), 
     ('CANCELADO', 'Cancelado'), 
    ) 
    titulo = models.CharField(max_length=200) 
    conteudo = models.TextField() 
    tipo = models.CharField(max_length=30, choices=TIPOS_TICKET, default='BUG') 
    status = models.CharField(max_length=30, choices=STATUS_TICKET, default='ABERTO') 
    projeto = models.ForeignKey(
     Projeto, 
     on_delete=models.CASCADE, 
     limit_choices_to={'usuarios':1} 
    ) 
    usuario = models.ForeignKey(
     User, 
     on_delete=models.CASCADE, 
     null=True 
    ) 
    data_abertura = models.DateTimeField('Data Abertura', auto_now_add=True) 
    data_fechamento = models.DateTimeField('Data Fechamento', blank=True, null=True) 

    def __str__(self): 
     return str(datetime.strftime(self.data_abertura, "%d/%m/%y %H:%M") + " | " + self.titulo) 

    def save(self, *args, **kwargs): 
     self.usuario = User 
     super(Ticket, self).save(*args, **kwargs) 

class TicketMsg(models.Model): 
    """ 
     Mensagens dos tickets 
     Retorna: 
      texto da mensagem 
    """ 
    texto = models.TextField() 
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) 
    data_resposta = models.DateTimeField('Data Resposta') 

    def __str__(self): 
     return str(self.texto) 

而且我admin.py文件:

from django.contrib import admin 
from django.contrib.auth.models import User 
from .models import Ticket, TicketMsg, Projeto 

# Register your models here. 
class ProjetoAdmin(admin.ModelAdmin): 
    model = Projeto 
    filter_horizontal = ('usuarios',) 

class TicketAdmin(admin.ModelAdmin): 
    model = Ticket 
    exclude = ('status', 'data_fechamento', 'data_abertura', 'usuario') 
    list_display = ('titulo', 'tipo', 'status', 'projeto', 'data_abertura') 
    list_filter = ('projeto', 'tipo', 'status') 

    def get_ordering(self, request): 
     return ['data_abertura'] 

admin.site.register(Projeto, ProjetoAdmin) 
admin.site.register(Ticket, TicketAdmin) 
admin.site.register(TicketMsg) 

這是我的機票從Django管理列表。

inserir a descrição da imagem aqui

的想法,是使用默認的Django用戶系統,以確定誰是試圖打開一個票。

我用成功做了系統過濾每個用戶可以打開門票的項目,但現在我不能設置爲默認值誰是輸入新門票的當前用戶。

這實際上是我的形式。

inserir a descrição da imagem aqui

所有幫助是值得歡迎的! 謝謝你們!

回答

2

當前登錄的用戶作爲Djangos請求響應生命週期的一部分附加在請求對象上。你不能在模型的方法中訪問請求(就像你想在save()方法中那樣)。

但是,您可以覆蓋save_model()的管理形式,其中要求可用的方法:

class TicketAdmin(admin.ModelAdmin): 
    model = Ticket 
    exclude = ('status', 'data_fechamento', 'data_abertura', 'usuario') 
    list_display = ('titulo', 'tipo', 'status', 'projeto', 'data_abertura') 
    list_filter = ('projeto', 'tipo', 'status') 

    def get_ordering(self, request): 
     return ['data_abertura'] 

    def save_model(self, request, obj, form, change): 
     obj.usuario = request.user 
     super(TicketAdmin, self).save_model(request, obj, form, change) 

沒有必要覆蓋save()方法在你的模型然後。

有關的ModelAdmin官方Django文檔的更多信息:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

+0

Saddly它不工作。 這裏是答案: ValueError at/admin/tickets/ticket/add/ 無法分配「」:「Ticket.usuario」必須是「User 「instance.' –

+0

我猜你沒有刪除Ticket模型上的save()方法,正如我在答案中所述。錯誤告訴你,你不能指定用戶使用usuario;這是有道理的,usuario是一個用戶實例。可悲的是,你沒有複製包含錯誤代碼行的堆棧跟蹤部分。將來你可以檢查那些容易提示你的問題。 – Max

+0

你好@Max .... TY !!!!你是最好的!是的,我忘了刪除save()。 –

相關問題