1

Ubuntu 12.04でPython 2.7でDjango 1.4を使用しています。

編集:同じ問題が再発したように見えるため、この質問の誤った部分をいくつかクリアしています。それは素晴らしく機能していました-私は変更を加えていません-そして今は失敗しています. どうしたの?

これは基本的にビューがどのように見えるかです:

@login_required
def request_new_project(request):
    """
    ..  function:: request_new_project()

        Collect information to call the form used to create a new project

        :param request: Django Request object
    """
    user_dict = { 'rsb_username'  : request.user.username}
    form = CreateProject(initial = user_dict)
    data = { 'user' : request.user }
    data.update(csrf(request))
    data.update({ 'form' : form })

    return render_to_response("create_project.html", data)

@login_required
def add_project(request):
    """
    ..  function:: add_project()

        Add a project for the user

        :param request: Django Request object
    """

    if (request.method == "POST"):
        user = User.objects.get(username = request.POST.get('rsb_username'))
        userProfile = UserProfile.objects.get(user = user)

        new_project = Projects(client = userProfile,
                               project_name = request.POST.get('rsb_project_name'),
                               description = request.POST.get('rsb_description'),
                               budget = request.POST.get('rsb_budget'),
                               time_frame = request.POST.get('rsb_time_frame'),
                               time_frame_units = request.POST.get('rsb_time_frame_units'),
                               contact = request.POST.get('rsb_point_of_contact'),
                               contact_email = request.POST.get('rsb_contact_email'),
                               contact_phone = request.POST.get('rsb_contact_phone'),
                               price_quote = 0,
                               eta = 'To Be Determined',
                               current_status = 'Waiting for quote',
                               )
        new_project.save()
        return view_projects(request)

次のエラーが表示されます。

Cannot assign "<UserProfile: UserProfile object>": "Projects.client" must be a "User" instance.

モデルチェンジはしていません。

# Create a table for users
class UserProfile(models.Model):
    user = models.OneToOneField(User)

    # Client Info
    company_name = models.CharField(max_length = 200)
    client_type = models.CharField(max_length = 200)
    address1 = models.CharField(max_length = 200)
    address2 = models.CharField(max_length = 200)
    city = models.CharField(max_length = 200)
    state = models.CharField(max_length = 200)
    country = models.CharField(max_length = 200)
    zip_code = models.CharField(max_length = 200)
    phone_number = models.CharField(max_length = 200)

# Create a table to manage project requests
class Projects(models.Model):
    client = models.ForeignKey(User)
    project_name = models.CharField(max_length = 50)
    description = models.TextField()
    budget = models.CharField(max_length = 50)
    time_frame = models.DecimalField(max_digits = 3, decimal_places = 1)
    time_frame_units = models.CharField(max_length = 25)
    contact = models.CharField(max_length = 50)
    contact_email = models.EmailField()
    contact_phone = models.CharField(max_length = 25)
    price_quote = models.DecimalField(max_digits = 10, decimal_places = 2)
    eta = models.CharField(max_length = 200)
    current_status = models.CharField(max_length = 200)

助言がありますか?

rsb_projects更新 1: 実際のデータベースから、制約 の 1 つが次のようになっていることがわかります。rsb_projects_client_id_fkey (client_id) REFERENCE rsb_userprofile (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED

それが役に立ったら...

データベースに対して を定義ForeignKeyしたにもかかわらず、 IDが必要なようです。models.pyUserUserProfile

考え?

4

1 に答える 1

2

エラーはまさにそれが言っていることです。

新しいプロジェクトを作成するには、プロジェクト オブジェクトにユーザー プロファイル IDではなく、ユーザープロファイル オブジェクトを指定する必要があります。

   user = User.objects.get(id=7)
   userprofile = user.get_profile()
   project.client = userprofile

userprofileプロジェクト インスタンスの client 属性に割り当てられているのはオブジェクトであることに注意してください。オブジェクトの ID をプロジェクト インスタンスの client 属性に割り当てることはできません。userprofile

また、ユーザー ID とユーザー プロファイル ID を混同しないでください。まったく同じではない場合があります。

ユーザー ID は、データベースに新しいユーザーが作成されるたびに、auth_user テーブルで自動生成される主キーです。userprofile id は、ユーザーに関連する対応するユーザー プロファイルが作成されるたびに、profiles_userprofile テーブルで自動生成される主キーです。

つまり、add_projectビュー関数は次のように読み取る必要があります

if (request.method == "POST"):
    user = User.objects.get(username = request.POST.get('rsb_username'))
    # userprofile = UserProfile.objects.get(user = user)  <-- we don't need this anymore.

    new_project = Projects(client = user,  # <--- give it a user instance of course now that your model has changed
                           project_name = request.POST.get('rsb_project_name'),
                           description = request.POST.get('rsb_description'),
                           budget = request.POST.get('rsb_budget'),
                           time_frame = request.POST.get('rsb_time_frame'),
                           time_frame_units = request.POST.get('rsb_time_frame_units'),
                           contact = request.POST.get('rsb_point_of_contact'),
                           contact_email = request.POST.get('rsb_contact_email'),
                           contact_phone = request.POST.get('rsb_contact_phone'),
                           )
    new_project.save()

重要なポイントは、元のモデル定義が何であるかを確認する必要があるということです。

Project クラスでクライアント属性が FK として User に割り当てられている場合は、ユーザー オブジェクトを指定する必要があります。

Project クラスでクライアント属性が UserProfile の FK として割り当てられている場合は、userprofile オブジェクトを指定する必要があります。

于 2012-10-14T14:13:04.330 に答える