【问题标题】:OneToOne field in a django modelformdjango modelform 中的 OneToOne 字段
【发布时间】:2017-08-17 17:37:48
【问题描述】:

我有一个对应于用户 (user_id) 的 OneToOne 字段,在我的头像上传表单中,我得到一个所有用户的下拉列表以选择一个,但我希望 django 用当前登录的用户填充它。此外,在提交表单时,对于某些用户,我会收到此消息“此用户的个人资料已存在。”

对于第一个问题,我认为内联表单集是解决方案,但我不知道如何将this 应用于我的表单。我不知道第二个问题。每次创建新用户时,我都会使用信号创建配置文件,但我不知道如何更新它。我是 Django 新手。

这是我的模型的代码:

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)
    avatar_img = models.ImageField(upload_to='avatars', blank=True)

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

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

形式:

from django import forms
from profiles.models import Profile

class AvatarForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('user', 'avatar_img', )

还有观点:

from django.shortcuts import render, redirect
from profiles.forms import AvatarForm

def model_form_upload(request):
    if request.method == 'POST':
        form = AvatarForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('index')
    else:
        form = AvatarForm()
    return render(request, 'profiles/avatar_form.html', {
        'form': form
    })

谢谢。

更新解决方案...我将其添加到表单中:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['user'].widget.attrs['disabled'] = 'true'
    self.fields['user'].widget = HiddenInput()

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以对表单使用初始参数。在视图中创建表单对象时,您可以为表单提供初始参数。

    在你看来。

    这个

    form = AvatarForm()
    

    可以替换为

    form = AvatarForm(initial={'user': request.user})
    

    This 参考应该对你有帮助。

    【讨论】:

    • 选择当前登录的用户,但该字段仍显示在表单中,因此任何用户都可以更改它并更新另一个用户的头像。如果我删除表单中的“用户”字段,我会收到“列 'user_id' 不能为空”错误。这就是为什么我认为必须使用内联表单集来完成。即使隐藏了该字段,我也不认为这是一个解决方案,因为它仍然可以被恶意用户编辑。
    • 谢谢。关于如何处理“此用户的个人资料已经存在”的任何想法。留言?
    • 您必须为此提出一个新问题。否则你原来的问题会转移。如果它对您有帮助,我建议您接受这个问题的答案并提出一个新问题,我们很乐意为您提供帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2016-11-10
    • 2010-10-05
    • 2011-01-14
    相关资源
    最近更新 更多