首页 > 编程问答 >在 Django 中注册时未填充国家/地区字段

在 Django 中注册时未填充国家/地区字段

时间:2024-07-28 08:50:44浏览次数:14  
标签:python django

当用户注册时,我想将他们的国家/地区添加到他们的个人资料中。但是,该字段在数据库中仍为空白,并且不会填充国家/地区。我是 Django 中的身份验证新手,因此其他方面可能是错误的。我认为顺序可能是问题所在?我真的不确定。

Views.py

def get_country(ip):

    if ip in ['127.0.0.1', 'localhost', '::1']:
        return 'Localhost'

    # Perform GeoIP lookup

    g = GeoIP2()
    try:
        result = g.city(ip)
        country = result["country_name"]
    except Exception as e:
     
        print(f'Error: {e}')  
        country = "Unknown"

    return country


def signup_view(request):
    if request.method == 'POST':
        form = UserCreateForm(request.POST)
        if form.is_valid():
            user = form.save()

            # Get the user's IP address

            x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
            if x_forwarded_for:
                ip = x_forwarded_for.split(',')[0].strip()
            else:
                ip = request.META.get('REMOTE_ADDR')

            # Determine the user's country
            country = get_country(ip)

            # Create the profile with the country information

            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            Profile.objects.create(user=user, country=country)
            user = authenticate(username=username, password=raw_password)
            login(request, user)

            return redirect('/')
    else:
        form = UserCreateForm()
    return render(request, 'signup.html', {'form': form})

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(
        default='profile_pics/default.jpg', upload_to='profile_pics')
    country = models.CharField(max_length=100)

    def __str__(self):
        return f'{self.user.username} Profile'


@receiver(post_save, sender=User)
def manage_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.get_or_create(user=instance)

我已经使用 RequestFactory() 在 shell 中运行了 get_country 函数,并且根据 ip 获得了正确的国家/地区。所以,这个功能还是不错的。它正在注册期间更新国家/地区的个人资料,但这是行不通的。


问题在于你创建了 两次 用户资料:

  1. signup_view 中: 在这里,你明确地创建了 Profile 实例,但这发生在用户登录之前。
  2. manage_profile 信号接收器中: post_save 信号被触发时,此函数会为每个新创建的用户创建一个 Profile 实例。

由于你在 signup_view 中没有将用户保存到数据库,因此 manage_profile 信号接收器创建了一个新的、空的 Profile 实例,而这个实例没有包含任何国家/地区信息。

为了解决这个问题,你应该在 signup_view 中创建 Profile 实例 之后 立即保存用户:

def signup_view(request):
    # ... existing code ...

            # Create the profile with the country information
            Profile.objects.create(user=user, country=country)

            # Save the user to the database
            user.save()

            # Authenticate and log in the user
            user = authenticate(username=username, password=raw_password)
            login(request, user)

            return redirect('/')
    # ... existing code ...

通过这样做, post_save 信号将会检测到一个已经存在的 Profile 实例,并且不会创建新的实例。

另外,你也可以完全删除 manage_profile 信号接收器,并在 signup_view 中处理所有用户资料创建逻辑,因为你已经在明确地创建它了。

标签:python,django
From: 78802731

相关文章

  • 有没有办法在Python中使用OpenCV在边界框后面画一条线?
    我正在为我的本科论文编写一个应用程序,该应用程序从根本上允许使用OpenCV库跟踪视频源中的多个对象。为了进一步发展这个想法,我希望能够在屏幕上画一条线,显示边界框在我正在跟踪的对象周围的历史记录。我注意到没有排序用于执行此操作的内置函数,因此任何有关制作此类内容的......
  • 如何向 python pandas 数据透视表添加过滤器? (pd.read_excel)
    我正在尝试使用pandas库在python中重新创建我在Excel中制作的数据透视表。我试图用时间段作为过滤器来总结超过500k行的OD总行程数据。在Excel上,我只会执行行(O)、列(D)、值(行程)、过滤器(时间)。到目前为止,在python上我只有索引、列、值、aggfunc,但我不知道如何过滤。有......
  • 标量添加中的 Python 溢出警告
    我想执行一个简单的操作:b+g+rb,g,r变量是整数并且值低于256。我收到溢出警告和错误的结果。问题是操作很简单(结果不高于765),我不应该收到溢出警告这是我的代码:importcv2ascvimportnumpyasnpimgname='r_hh_classic.png'img=cv.imread(imgname)h,w,_=......
  • 在 Python 中读取部分 MP3 文件时处理“对于可用位计数来说太大”错误
    我正在尝试读取MP3文件的特定部分,但遇到错误:[src/libmpg123/layer3.c:INT123_do_layer3():1771]error:part2_3_length(1376)toolargeforavailablebitcount(760)可以访问音频文件此处我的环境是使用此Docker映像设置的:pytorc......
  • Python SQLAlchemy 2.0 使用 dataclass_transform 非必需字段类型
    我刚刚在一个新项目上安装了SQLAlchemy2.0,我正在尝试使我的模型尽可能类型安全。通过使用@typing_extensions.dataclass_transform,我已经能够实现我想要实现的大部分目标类型检查,但是当前所有字段都被标记为不需要。例如:@typing_extensions.dataclass_tran......
  • 当读取字节时,Python 将 \n 解释为 0xd0
    换行符被解释为Ð(0xd0)而不是(0x0a),我真的不知道如何解决这个问题。我也不知道从哪里开始。当尝试使用此代码时,它将0x0a读为0xd0。withopen(path,"rb")asroot:b_arr=root.read()+b""print("Processing...")buffer=""b_arr......
  • 在Python 3中获取范围的特定形式
    当获取range(1,100)时,我得到:[1,2,3,4,5...99]我需要像这个范围的zip之类的东西:[50,49,51,48,52,47,53...99]如何获取它?背景:这都是关于比特币谜题66的。首先我做了对过去已知的私钥进行线性回归预测,直到第65题为止。我......
  • Python:如何使用pyaudio或sounddevice等库进行自动录音?
    我想做一个项目,需要满足以下录音要求:程序启动后,会在后台不断检测麦克风的声音,当声音分贝大于一定值时打开录音流级别,当分贝低于一定级别时关闭录音流并保存为wav文件。我知道原理,但我无法使用这些库来实现。我想实现以上结果使用Python实现自动录音以下代......
  • 当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处
    python脚本使用Urllib3,我的服务器是在Node.js上编写的脚本。我担心(并且不清楚)证书:我是否需要将我的python应用程序上的证书另存为变量?例如我这样做了,http=urllib3.PoolManager(cert_reqs="CERT_REQUIRED",ca_certs='client-cert.pem')并且我不知道......
  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......