Como faço para apoiar automaticamente os campos em Django?
-
03-07-2019 - |
Pergunta
Eu tenho uma pergunta modelo com um campo chamado ID do usuário, Antes de fazer uma pergunta, é preciso fazer login, eu quero que, ao salvar para capturar o ID do usuário do usuário logado atualmente e atribui-lo ao UserID do modelo de perguntas.
Observe que não estou mostrando o UserID no meu formulário IE no modelo de perguntas que declarei o UserID da seguinte forma;
Classe Pergunta (Models.model): ... UserID = Models.foreignKey (Usuário, Editável = Falso) ...
Como atribuo ID de usuário conectado ao modelo de perguntas ID do usuário?
Solução
Seu código pode ser assim:
from django.contrib.auth.decorators import login_required
class QuestionForm(forms.ModelForm):
class Meta:
model = Question
@login_required
def ask(request):
form = QuestionForm(request.POST)
if form.is_valid():
question = form.save(False)
question.userid = request.user
question.save()
#...
Outras dicas
Este blog A entrada (de James Bennett) pode ser útil para você também ... ela estabelece uma maneira de fazer quase exatamente o que você precisa.
Para um recurso mais recente - e provavelmente atualizado -, recomendo a documentação oficial do Django. Este mesmo exemplo entrou na seção ModelAdmin Methods of the Admin Documentation:https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#modeladmin-methods
Se você é como eu, ficará tentado a pegar esse exemplo e correr, mas pode se beneficiar de desacelerar, demorando alguns minutos para ler e depois implementar - eu certamente teria ...
Observe que apontei para 1.6, mas no canto inferior direito da página é um seletor dinâmico que permite escolher sua versão. (Esses documentos incríveis são o que está me empurrando para o Django da Rails!)
Uma coisa a ter em mente é o fato de que você não pode acessar o objeto de solicitação (e, portanto, o usuário atual) de seus modelos sem invadir as restrições de design do Django.
Portanto, truques legais, como os campos automaticamente preenchidos como Create_By e Updated_By, não funcionam no Django. Você precisa definir esses campos manualmente em seus pontos de vista, conforme ilustrado por @daevaorn.