1

私は何時間もこれを理解しようとしてきましたが、私を信じてください、私は本当にスタックオーバーフローのいたるところを見ました。

私の UserProfile には、別のモデル (「Company」と呼ばれる) への ForeignKey 参照があり、登録時に新しい Company を作成し、UserProfile ForeignKey をその Company に向けます。

models.py は次のとおりです。

class UserProfile(models.Model):
  company = models.ForeignKey(Company)
  title = models.CharField(max_length = 50, default = '')
  user = models.OneToOneField(User, default = 0, null = True)

class Company(models.Model):
  """A company profile."""
  name = models.CharField(max_length = 50)

フォームを使用してサインアップを行います。フォームは次のとおりです。

class SignupForm(ModelForm):
  name = forms.CharField(label = "Name")
  company = forms.CharField(max_length = 50)
  email = forms.EmailField(label = "Email")
  password = forms.CharField(widget=forms.PasswordInput)

  class Meta:
    model = User
    fields = ("name", "company", "email", "password")

  def save(self, commit=True):
    user = super(SignupForm, self).save(commit=False)
    name = self.cleaned_data["name"].split()
    if len(name) == 1:
      # User did not enter a last name.
      user.first_name = name
    else:  
      user.first_name, user.last_name = name
    user.email = self.cleaned_data["email"]
    user.set_password(self.cleaned_data["password"])
    user.username = user.email
    if commit:
      user.save()

    return user

サインアップビューは次のとおりです。

def signup(request):
  if request.method == 'POST':
    form = SignupForm(request.POST)
    if form.is_valid():
      # Check if email has already been used for an account.
      email = request.POST['email']
      existing_account = User.objects.filter(email = email)
      if existing_account:
        form = SignupForm()
        return render_to_response('registration/signup.html',
          { 'form': form,
            'error': 'duplicate_email',
          })

      # Otherwise, save the form and create a new user.
      new_user = form.save()

      company = Company(name=request.POST['company'])
      company.save()

      user_profile = new_user.get_profile()
      user_profile.company = company
      user_profile.save()

      new_user = authenticate(
        username = email,
        password = request.POST['password']
      )
      # Log the user in automatically.
      login(request, new_user)

      # Redirect user to Thank You page.
      return HttpResponseRedirect('/thanks')
  else:
    form = SignupForm()

  return render_to_response('registration/signup.html', {
    'form': form,
  })

私が得ているエラーは、company_id を null にすることはできないということです。私は明らかに新しい会社を追加します。間違っていると思われる点を教えてください。

ありがとう

4

2 に答える 2

0

SQLite が原因であることを除いて、理由もなく、今日まさにこのエラーが発生しました。SQLite では、1 つのテーブルの id フィールドが INTEGER PRIMARY KEY から INTEGER になりました。SQLite を使用している場合は、問題のあるテーブルを削除して、syncdb で再作成してみてください。

の値は何ですか

user_profile = new_user.get_profile()

?

于 2012-05-11T22:07:15.487 に答える
0

これがあなたの好みにとってハックすぎると感じるかどうかはわかりませんが、おそらく Company オブジェクトを作成/保存し、それを位置/キーワード引数として SignupForm.save() メソッドに渡すことができます。

そこで得られる問題は、CharField が必要であり、会社のオブジェクトを渡すことです。そのため、フォームの company フィールドに company.pk を指定するとよいでしょう。

于 2012-05-12T01:56:34.297 に答える