django - 如何将带有表单的登录用户名保存到数据库?姜戈
问题描述
所有其他数据都保存得很好,但如下所示,用户 ID 部分显示为下拉栏和一个空值,应该是一个登录的用户名。
我的代码有什么问题? 数据库页面
这是我的代码。
视图.py
from .models import Markers
from .forms import AddMarkersInfo
from django.http import HttpResponse
def addinfo(request):
if request.method == 'POST':
mks = AddMarkersInfo(request.POST)
if mks.is_valid():
submit = mks.save(commit=False)
submit.user = request.user
submit.save()
name = mks.cleaned_data['name']
address = mks.cleaned_data['address']
description = mks.cleaned_data['description']
type = mks.cleaned_data['type']
lat = mks.cleaned_data['lat']
lng = mks.cleaned_data['lng']
Markers.objects.get_or_create(name=name, address=address, description=description, type=type, lat=lat, lng=lng)
return render(request, 'home.html', {'mks': mks })
else:
mks = AddMarkersInfo()
return render(request, 'home.html', {'mks': mks})
模型.py
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.contrib.auth import get_user_model
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class Markers(models.Model):
User = settings.AUTH_USER_MODEL
use_id= models.ForeignKey(User, null=True, on_delete=models.SET(get_sentinel_user),)
name = models.CharField(max_length=60,default = 'name')
address = models.CharField(max_length=100,default = 'address')
description = models.CharField(max_length=150, default='description')
types = (
('m', 'museum'),
('s', 'school'),
('r', 'restaurant'),
('o', 'other'),
)
type = models.CharField(max_length=60, choices=types, default='museum')
lat = models.IntegerField()
lng = models.IntegerField()
表格.py
from django import forms
from maps.models import Markers
class AddMarkersInfo(forms.ModelForm):
class Meta:
model = Markers
fields = ['name','address','description', 'type','lat','lng',]
解决方案
好吧,首先,from django.contrib.auth.models import User
如果User = settings.AUTH_USER_MODEL
您models.py
要使用settings.AUTH_USER_MODEL
. 您应该只使用两者之一。
您可以将您的字段更改为:
use_id= models.ForeignKey(settings.AUTH_USER_MODEL, ...
其次,您似乎在复制创作。线条
submit = mks.save(commit=False)
submit.user = request.user
submit.save()
已经创建了一个Markers
实例,所以之后不需要调用Markers.objects.get_or_create(...
。
而且,根据您的模型,该字段应该是submit.use_id
而不是submit.user
.
现在,如果我正确理解您的问题,您希望use_id
在表单/模板中将该字段设为只读。
我不知道为什么该字段甚至出现在您的表单中,因为它没有列在您的表单中Meta.fields
。
您可以尝试设置小部件属性readonly
:
class AddMarkersInfo(forms.ModelForm):
class Meta:
model = Markers
fields = ['use_id', 'name', 'address', 'description', 'type', 'lat', 'lng']
widgets = {
'use_id': forms.Textarea(attrs={'readonly': 'readonly'}),
}
推荐阅读
- image - 如何在 open-cv 或 emgu-cv 中使用傅立叶变换对图像进行去模糊?
- spring-boot - Spring Batch:无法为表中的标识列插入显式值
- python - 加载以前保存的没有自定义层的模型时缺少 get_config
- flutter - 变量名重复,一定有办法减少代码
- r - 格式化 R 中表的分组数据
- nginx - 如何在 nginx 中动态匹配 URL 位置
- twig - HTML 代码在 OpenCart 运输方法标签中不起作用
- java - 尝试使用 @Value 从属性文件设置 @Scheduled 的 cron 属性,但出现编译时错误
- flutter - 如何在颤动的字符串中使用特殊的unicode字符?
- c++ - 在 Windows 中创建 OpenGL 上下文