5

ここの Django 初心者は、フォームを機能させるのに苦労しています。はい、私はチュートリアルに取り組み、Web をたくさん閲覧しました。私が持っているのは、ここと他のサイトで見つけたものを組み合わせたものです。Python 2.7 と Django 1.5 を使用しています。(公式ドキュメントは広範囲に渡っていますが、ほとんどのことを既に知っていると想定する傾向があります。初心者向けのリファレンスとしても、上級者向けのチュートリアルとしても適切ではありません)

「拡張」ユーザー詳細のフォームを作成しようとしています-たとえば。会社名、住所などですが、フォームデータはデータベースに保存されていません。

最初は、標準モデルを拡張したモデルを作成しようとしましたUserが、それをあきらめました。変更が多すぎて、この段階では私をはるかに超えていました。代わりに、UserProfile次の新しいモデルを作成しました。

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=True) 
    company = models.CharField(max_length=50, blank=True)
    address1 = models.CharField(max_length=50, blank=True)
    address2 = models.CharField(max_length=50, blank=True)
    city = models.CharField(max_length=20, blank=True)
    region = models.CharField(max_length=20, blank=True)
    postcode = models.CharField(max_length=10, blank=True)
    country = models.CharField(max_length=20, blank=True)
    phone = models.CharField(max_length=30, blank = True)

User モデルにForeignKey(上記のように) または OneToOne を使用してリンクする必要があるかどうかについて、オンラインでさまざまな参照を見てきました。

ModelForm を使用しようとしています (シンプルなフォームであるべきものをシンプルに保ちます)。これが私のforms.pyです

from django.forms import ModelForm
from .models import UserProfile   

class UserDetailsForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ['company','address1','address2','city','region', 'postcode','country','phone']

これが私の見解です:

def UserDetailsView(request):
    #f = 0
    if request.method == 'POST':
        f = UserDetailsForm(request.POST, instance = request.user)
        if f.is_valid():
            f.save()
    else:
        f = UserDetailsForm(request.POST , instance = request.user)

    print "UserDetails objects: ", (UserProfile.objects.all()) 

    return render_to_response('plagweb/console/profile.html', 
                              { 'form': f}, 
                              context_instance=RequestContext(request))     

(はい、UserProfile と UserDetail に矛盾があります。これは私のすべてのハッキングの結果であり、機能するようになったら修正されます)

診断はf.is_valid()、True を返すことを示しています。同様に、診断UserProfile.objects.all()は空として表示されます。save() の後の上記のビューと、Django コンソールでもこれを試しました。

ここに私のテンプレートがあります:

 <form method="POST" action="">
 <table>{{ form }}</table>
 <input type="submit" value="Update" />
 {% csrf_token %}
 </form>

現時点での主な問題は、フォーム データがデータベースに保存されていないことです。まだ読み取られているかどうかはわかりません(データベースにデータがあれば...)

1つの考えは、User関係が問題を引き起こしている可能性があるということですか?


ダニエル・ローズマンの有用なコメント/ヘルプに続く補遺:

現在、フォームは正しく保存されています (診断とコマンド ライン チェックで確認されています。ただし、フォームに戻ると、既存のデータが表示されていません。データ フィールドが空のフォームが表示されます。 m インスタンス データを正しく渡します。

変更が必要な ModelForm 設定はありますか?

変更されたビューは次のとおりです。

def UserDetailsView(request):
    #print "request co:", request.user.profile.company
    f = UserDetailsForm(request.POST, instance = request.user.profile )

    if request.method == 'POST':
        if f.is_valid():
            profile = f.save(commit=False)
            profile.user = request.user
            profile.save()

    return render_to_response('plagweb/console/profile.html', 
                              { 'form': f}, 
                              context_instance=RequestContext(request))     

診断は、request.user.profile正しく設定されていることを示しています (具体的には会社フィールド)。ただし、フォームは空のフィールドで表示されます。HTML ソースにもデータ値は表示されません。追加のチェックとして、いくつかのテンプレート診断も試しました。

<table border='1'>
    {% for field in form%}
        <tr>
            <td>{{field.label}}</td>
            <td>{{field.value}}</td>
        </tr>
    {% endfor%}
</table>

これにより、フィールド ラベルが正しく一覧表示されますが、値はすべて として報告されNoneます。

完全を期すために、UserProfile の user フィールドは として定義されuser = models.OneToOneField(settings.AUTH_USER_MODEL)、User.profile ラムダ式は変更されていません。

4

6 に答える 6

19

ここで何が問題なのか正確にはわかりませんが、1 つの問題は確かにinstance=request.user、フォームをインスタンス化するときに渡していることです。それは間違いです:request.userは User のインスタンスですが、フォームは に基づいていUserProfileます。

代わりに、次のようにします。

f = UserDetailsForm(request.POST)
if f.is_valid():
    profile = f.save(commit=False)
    profile.user = request.user
    profile.save()

ForeignKey と OneToOne に関しては、絶対に OneToOne を使用する必要があります。OneToOne の元の実装が貧弱で、書き直す予定だったため、ForeignKeys の使用に関するアドバイスは、Django 1 のリリースに向けてしばらくの間 (今からほぼ 5 年前) 与えられました。ここには、FK の使用を勧める最新のドキュメントはありません。

コメントの後に編集 問題は、リクエストが POST ではなく、したがってrequest.POST空の辞書であっても、最初のパラメータ data でフォームをインスタンス化していることです。ただし、データ パラメーターは、たとえそれが空であっても、初期データとして渡されるものよりも優先されます。

ステートメント内でフォームをインスタンス化する元のパターンに戻る必要がありますが、句内で実行する場合はifパスしないようにしてください。request.POSTelse

于 2013-08-17T09:04:34.273 に答える
2

これは一種の古いスレッドですが、これが誰かの助けになることを願っています。私は同様の問題に苦労してきました.dbからオブジェクトを開始し、フィールドを更新し、save()関数を呼び出しましたが、何も起こりませんでした。

user = User.objects.get(username = example_string)
user.userprofile.accepted_terms = True
user.userprofile.save()

フィールドaccepted_termsが最近追加され、それが問題でした。最初に を試しpython manage.py makemigrationsてくださいpython manage.py migrate。これで問題が解決しない場合は、データベースをフラッシュする必要があります。

私の場合の解決策は、データベースをフラッシュすることでした。

于 2019-05-18T09:27:33.973 に答える
0
UserDetailsForm(request.POST, instance = db_obj_form)

db_obj は、保存するテーブル UserProfile のオブジェクトである必要があります。

于 2013-08-17T09:20:48.967 に答える
0

フォーム データを Django コードに送信しようとすると、Django はフォーム データ全体に対してオブジェクトを作成します。オブジェクトは次のようになりますform_obj = request.method_namemethod_nameこれは(POSTまたはGET)exのフォームメソッドです:-form_obj = request.POST

フォーム データを取得する場合は、関数 request.method_name.get(name) を使用します。ここで name はフォーム属性の割り当て値です。

元:-

<form method="post">
{% csrf_token %}
{form}
</form>

ビューで :-

import statements as you required
def your_function(request):
  # you can creat a object to the form by
  form_obj = myform()
  if request.method =="POST":
    form_obj = myform(request.POST)
    if form_obj.is_valid():

      # you can directly save by use commit()
      form_obj.save(commit=True)
       #   or
      form_obj1 = form_obj.save(commit=False)
      #which  do you want to save in database ,those fields you need to specify like below 
      form_obj1.attribute1 = form_obj.cleaned_data["name of form field"]
        '
        '
      form_obj1.save()

および Myform.py ファイルで

import statments    
class myform(forms.ModelForm):
    class meta():
        model = your_models_name
        fields =("attribute1","attribute2".....) # included attribute of your_model
于 2020-05-21T16:07:03.197 に答える