首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UserProfile.location“必须是"Location”实例

UserProfile.location“必须是"Location”实例
EN

Stack Overflow用户
提问于 2012-04-23 21:48:46
回答 1查看 179关注 0票数 1

在理解表单和模型表单之间的关系时,我仍然遇到一些问题。我收到一个错误: UserProfile.location“必须是一个"Location”实例。

我已经将models中的位置设置为blank=True、null=True和forms.py中的required=False。在这一点上,我真的不知道该怎么做。

我该如何解决这个问题呢?

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import User

class Location(models.Model):
    location = models.CharField(max_length=32)
    #county = models.CharField(max_length=32)
    #province = models.CharField(max_length=32)

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True)
    location = models.ForeignKey("Location", null=True, blank=True)

    website = models.URLField("Site", null=True, blank=True)
    accepted_rules = models.BooleanField(default=False)
    accepted_rules_date = models.DateTimeField(auto_now_add=True)

    #points_count = models.IntegerField(default=0, null=True, blank=True)
    #posts_count = models.IntegerField(default=0, null=True, blank=True)
    #comments_count = models.IntegerField(default=0, null=True, blank=True)

表格:

代码语言:javascript
复制
from django import forms
from django.forms import Form
from django.forms.models import ModelForm
from accounts.models import UserProfile, Location
from django.contrib.auth.models import User


class UserCreationForm(forms.Form):

    username = forms.CharField(max_length=32)
    password = forms.CharField(widget=forms.PasswordInput())
    email = forms.EmailField()
    #password_repeat = forms.CharField(widget=forms.PasswordInput(render_value=False))

    def clean_username(self):

        try:
            # iexact = case-insensitive match / important for validation
            User.objects.get(username__iexact=self.cleaned_data['username'])
            print "User does already exist"
    except User.DoesNotExist:
        return self.cleaned_data['username'] 
    else:
        raise forms.ValidationError("User already exists")



def clean_email(self):

    if User.objects.filter(email__iexact=self.cleaned_data['email']):
        print u'Adres email jest już używany.' 
        raise forms.ValidationError('Adres email jest już używany.') 
    else:
        return self.cleaned_data['email']

def save(self):
    user  = User.objects.create(username = self.cleaned_data['username'], email = self.cleaned_data['email'],)

    user.set_password(self.cleaned_data['password'])
    return user


class UserProfileForm(ModelForm):
    website = forms.URLField(label="website", required=False)
    location = forms.ChoiceField(required=False)

    class Meta:
        model = UserProfile
        include = ['website', 'location']
        exclude = ('user', 'type', 'accepted_rules')

视图

代码语言:javascript
复制
contrib.auth.models import User
from django.template.response import TemplateResponse
from django.views.decorators.csrf import csrf_protect
from django.core.context_processors import csrf
from django.forms.models import inlineformset_factory
from django.http import HttpResponseRedirect

from accounts.forms import UserCreationForm, UserProfileForm



def index(request):
    return TemplateResponse(request, "base.html")

@csrf_protect
def register(request):
    form = UserCreationForm()
    user_profile = UserProfileForm()

    if request.method == "POST":

        form = UserCreationForm(prefix='user', data=request.POST or None)
        user_profile = UserProfileForm(prefix='profile', data= request.POST or None)

        if form.is_valid() and user_profile.is_valid():
            user = form.save()
            profile = user_profile.save(commit=False)
            profile.user = user
            profile.save()


            return HttpResponseRedirect("/")

    return TemplateResponse(request, 'accounts/register.html', {
                             'form':form,
                             'user_profile':user_profile ,
                             }
                            )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-23 21:58:58

问题就在这里。

代码语言:javascript
复制
class UserProfileForm(ModelForm):
    website = forms.URLField(label="website", required=False)
    location = forms.ChoiceField(required=False)

    class Meta:
        model = UserProfile
        include = ['website', 'location']
        exclude = ('user', 'type', 'accepted_rules')

ModelForm将为您的表单生成所需的字段。您不需要手动定义它们。所以你应该使用类似这样的东西。

代码语言:javascript
复制
class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        include = ['website', 'location']
        exclude = ('user', 'type', 'accepted_rules')

还有一件事。没有include选项,我想您是想使用fields。但是你不需要同时使用fieldsexclude,通常你需要使用其中的一个。在您的例子中,exclude就足够了。最终结果:

代码语言:javascript
复制
class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('user', 'type', 'accepted_rules')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10281840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档