首页 > 解决方案 > 如何将带有表单的登录用户名保存到数据库?姜戈

问题描述

所有其他数据都保存得很好,但如下所示,用户 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',]

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


好吧,首先,from django.contrib.auth.models import User如果User = settings.AUTH_USER_MODELmodels.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'}),
        }

推荐阅读