django - 如何保存构成表单的用户的信息?

时间:2018-05-31 07:24:55

标签: django django-models django-forms

我试图将登录的UserProfile的性别放入其中 这是UserProfile的类:

class UserProfile(models.Model):
    FEMALE = 'FEMALE'
    MALE = 'MALE'
    SEX = (
        (MALE, 'Male'),
        (FEMALE, 'Female'),
    )        
    birth_date = models.DateField()
    sex = models.CharField(max_length=5, choices=SEX, default=MALE)
    def __str__(self):
        return self.user.username

以下是观点:

@login_required
def add_post(request):
    form = PostForm()
    # A HTTP POST?
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
            return index(request)
        else:
            print(form.errors)
    return render(request, 'rango/add_post.html', {'form': form})

PostForm:

class PostForm(forms.ModelForm):
    discord = forms.CharField(max_length=500, help_text="Please enter the title of the post.")
    post = forms.CharField(max_length=500, help_text="Please enter the post.")
    telegram = forms.CharField(max_length=128, help_text="Please enter your telegram id.")
    class Meta:
        model = Post
        exclude = ("user",)

这是Post模型:

class Post(models.Model):
    user = models.ForeignKey(to=User, on_delete=models.CASCADE)
    discord = models.CharField(max_length= 500)
    post = models.CharField(max_length= 500)
    telegram = models.CharField(max_length=128)

    def __str__(self):  # For Python 2, use __unicode__ too
        return self.post

感谢您的每一个答案!

1 个答案:

答案 0 :(得分:0)

首先,您必须为PostForm添加额外字段。

class PostForm(forms.ModelForm):
    # add extra fields for sex
    sex = forms.CharField(...)

    discord = forms.CharField(max_length=500, help_text="Please enter the title of the post.")
    post = forms.CharField(max_length=500, help_text="Please enter the post.")
    telegram = forms.CharField(max_length=128, help_text="Please enter your telegram id.")
    class Meta:
        model = Post
        exclude = ("user",)

然后将其保存在视图中。

@login_required
def add_post(request):
    form = PostForm()
    # A HTTP POST?
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            # it will be post
            post = form.save(commit=False)
            sex = form.cleaned_data.get('sex')
            post.user = request.user
            post.save()

            # this is real profile from UserProfile model
            profile = post.user.userprofile
            profile.sex = sex
            profile.save()
            return index(request)
        else:
            print(form.errors)
    return render(request, 'rango/add_post.html', {'form': form})

P.S。我不清楚您的UserProfileUser是如何相关的。我想这是OneToOneField,那么您可以按post.user.userprofile

获取个人资料

我希望你解决得好!