django模型中的OneToOne字段

时间:2017-08-17 17:37:49

标签: django django-forms

我有一个与用户(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()

1 个答案:

答案 0 :(得分:0)

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

在您看来。

form = AvatarForm()

可以替换为

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

This参考应该对您有所帮助。