将登录用户的用户名作为标签放在 Django 表单字段中
Putting username of logged in user as label in django form field
我创建了简单的 django 博客应用程序,用户可以在其中登录和注销。在此应用程序中,用户只有在登录后才能创建新的 post。为此,我创建了一个用于为经过身份验证的用户创建 post 的表单,他必须在其中输入标题、作者姓名和上下文。
但我想将登录用户的用户名作为标签放在用户无法编辑的 Author_name 字段中。所以我禁用了该字段进行编辑,但我无法将登录用户的用户名作为标签放入该字段中。
需要帮助的人。
我的代码放在这里....
views.py
from django.shortcuts import render , redirect , get_object_or_404
from .models import Article , members
from django.views.generic import ListView , DetailView , TemplateView
from .forms import create_form
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
class article_view(ListView):
model = Article
template_name = "article.html"
context_object_name = "articles"
@login_required
def post_creator(request):
form = create_form()
if request.method == "POST":
form = create_form(request.POST)
if form.is_valid():
form.save()
return redirect("/blog/home/")
else:
form = create_form()
return render(request , "post_create.html" , {"form":form})
def registration(request):
if request.method == "POST":
form = members(request.POST)
if form.is_valid():
form.save()
return redirect("/blog/home/")
else:
form = members()
return render(request , "register.html" , {"form":form})
class post_detail_view(LoginRequiredMixin , DetailView):
model = Article
template_name = "detail.html"
#class profile(TemplateView):
# model = members
# template_name = "profile.html"
def counts(request):
counts = Article.objects.filter(author=request.user).count()
context = {
"counts":counts
}
return render(request , "profile.html" , context)
forms.py
from django import forms
from datetime import date
from .models import Article
import datetime
from django.contrib.auth.models import User
class create_form(forms.ModelForm):
author = forms.CharField(required=False , widget=forms.TextInput(attrs={'readonly':'True'}))
class Meta:
model = Article
fields = ["title" , "author" , "content"]
models.py
from django.db import models
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
date_pub = models.DateTimeField(auto_now=True)
content = models.TextField()
def __str__(self):
return self.title
class members(UserCreationForm):
email = models.EmailField()
class Meta:
model = User
fields = ["username" , "email"]
create_post.html
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<title>Create Post</title>
</head>
</head>
<body style="background-color: darkgrey;">
<div>
<fieldset style="width: 50%;background-color: white;padding: 25px ;margin-left: 350px;margin-top: 15px;border-color: black;">
<form method="POST">
<legend>Create New Post</legend>
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-outline-info" type="submit">Create</button>
</form>
</fieldset>
</div>
</body>
</html>
希望这有助于理解我的问题。
直接适用于您的代码的最简单的解决方案,您可以做到
form = create_form(initial={'author':request.user.username}) #or request.user may work because it returns the username as a string
作为更通用的解决方案,如果用户名因任何原因发生更改,它也会更新用户名,将使用 ForeignKey
在你models.py
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
date_pub = models.DateTimeField(auto_now=True)
content = models.TextField()
def __str__(self):
return self.title
在您的 forms.py 中不列出它 在 fields
中将其列为字段之一(保持原样)。
然后在你的views.py中赋值如下:
if form.is_valid():
instance=form.save(commit=False)
instance.author=request.user
instance.save()
为了保持一致性,您将示例中的 author
更改为 author_name
。这里的想法是,您可以按用户(或用户的任何其他 属性,例如年龄或性别或您的模型实际包含的任何内容)进行过滤
我创建了简单的 django 博客应用程序,用户可以在其中登录和注销。在此应用程序中,用户只有在登录后才能创建新的 post。为此,我创建了一个用于为经过身份验证的用户创建 post 的表单,他必须在其中输入标题、作者姓名和上下文。 但我想将登录用户的用户名作为标签放在用户无法编辑的 Author_name 字段中。所以我禁用了该字段进行编辑,但我无法将登录用户的用户名作为标签放入该字段中。 需要帮助的人。
我的代码放在这里....
views.py
from django.shortcuts import render , redirect , get_object_or_404
from .models import Article , members
from django.views.generic import ListView , DetailView , TemplateView
from .forms import create_form
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
class article_view(ListView):
model = Article
template_name = "article.html"
context_object_name = "articles"
@login_required
def post_creator(request):
form = create_form()
if request.method == "POST":
form = create_form(request.POST)
if form.is_valid():
form.save()
return redirect("/blog/home/")
else:
form = create_form()
return render(request , "post_create.html" , {"form":form})
def registration(request):
if request.method == "POST":
form = members(request.POST)
if form.is_valid():
form.save()
return redirect("/blog/home/")
else:
form = members()
return render(request , "register.html" , {"form":form})
class post_detail_view(LoginRequiredMixin , DetailView):
model = Article
template_name = "detail.html"
#class profile(TemplateView):
# model = members
# template_name = "profile.html"
def counts(request):
counts = Article.objects.filter(author=request.user).count()
context = {
"counts":counts
}
return render(request , "profile.html" , context)
forms.py
from django import forms
from datetime import date
from .models import Article
import datetime
from django.contrib.auth.models import User
class create_form(forms.ModelForm):
author = forms.CharField(required=False , widget=forms.TextInput(attrs={'readonly':'True'}))
class Meta:
model = Article
fields = ["title" , "author" , "content"]
models.py
from django.db import models
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
date_pub = models.DateTimeField(auto_now=True)
content = models.TextField()
def __str__(self):
return self.title
class members(UserCreationForm):
email = models.EmailField()
class Meta:
model = User
fields = ["username" , "email"]
create_post.html
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html>
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<title>Create Post</title>
</head>
</head>
<body style="background-color: darkgrey;">
<div>
<fieldset style="width: 50%;background-color: white;padding: 25px ;margin-left: 350px;margin-top: 15px;border-color: black;">
<form method="POST">
<legend>Create New Post</legend>
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-outline-info" type="submit">Create</button>
</form>
</fieldset>
</div>
</body>
</html>
希望这有助于理解我的问题。
直接适用于您的代码的最简单的解决方案,您可以做到
form = create_form(initial={'author':request.user.username}) #or request.user may work because it returns the username as a string
作为更通用的解决方案,如果用户名因任何原因发生更改,它也会更新用户名,将使用 ForeignKey
在你models.py
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
date_pub = models.DateTimeField(auto_now=True)
content = models.TextField()
def __str__(self):
return self.title
在您的 forms.py 中不列出它 在 fields
中将其列为字段之一(保持原样)。
然后在你的views.py中赋值如下:
if form.is_valid():
instance=form.save(commit=False)
instance.author=request.user
instance.save()
为了保持一致性,您将示例中的 author
更改为 author_name
。这里的想法是,您可以按用户(或用户的任何其他 属性,例如年龄或性别或您的模型实际包含的任何内容)进行过滤