2

ファイルをアップロードできません。私は得ています

Type error builtin_function_or_method' object is not iterable

models.py

class seeker(models.Model):
    user = models.OneToOneField(User)
    birthday = models.DateField()

class Upload(models.Model):
    user = models.ForeignKey(Seekers)
    resume = models.FileField(upload_to ='resume', blank = True, null = True)

forms.py

class SeekersForm(forms.Form):
    resume = forms.FileField(label = 'Select a file',help_text = 'max.3 MB')

views.py

def List(request):

    # Handle file upload
    if request.method == 'POST':
        form = SeekersForm(request.POST, request.FILES)
        if form.is_valid():

            #id = User.object.get(id)
            newdoc = Seekers.objects.get(user_id)
            newdoc.resume =Upload(resume = request.FILES['resume'])
            newdoc.save()

            #seekers_edit = Seekers.objects.get(id) 
            #seekers_edit.resume = Seekers(resume = request.FILES['resume'])
            #seekers_edit.save()

            #Redirect to the document list after POST
            return HttpResponseRedirect('/profile/')
    else:
        form = SeekersForm() # A empty, unbound form

    #Load documents for the list page   
    seekers = Seekers.objects.all()

    #Render list page with the documents and the form
    return render_to_response('list.html',{'seekers':seekers,'form':form},context_instance=RequestContext(request))
4

2 に答える 2

0

コードの問題:

  • フォーム定義はモデルからの情報を複製します—使用するだけですforms.ModelForm(フィールドexcludeを表示しないように)user
  • 現在貼り付けられているnewdoc = Seekers.objects.get(user_id)ように、TypeError( 'foo' object is not iterable) が発生します。.get()はキーワード パラメータ フィルタを受け入れますが、それ以外は受け入れません。
  • 手動でのアクセスrequest.FILES['resume']は不要または推奨されません

要するに、あなたはもうすぐそこにいます。Django フォームにもっと多くの作業を任せてください:

# forms.py
class SeekerForm(forms.ModelForm)
    class Meta:
        model = Seeker

# views.py    
def seeker_list(request):
    # Opinions are divided as to whether it's ever appropriate to 
    # modify the database like this on a GET request, but it seems
    # to make sense here
    seeker = Seekers.objects.get_or_create(user=request.user)
    if request.method == 'POST':
        form = SeekerForm(request.POST, request.FILES, instance=seeker)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/profile/')
    else:
        form = SeekerForm(instance=seeker)

    seekers = Seekers.objects.all()

    #Render list page with the documents and the form
    return render_to_response('list.html', {
        'seekers':seekers,
        'form':form
    }, context_instance=RequestContext(request))

コードのコメントアウトされたセクションの重要性 (もしあれば) が何であるかは明確ではありません — 私はあなたが常に現在のユーザーの を変更したいと思っていると仮定しましたSeekerが、そうでない場合は適切に適応させてください。

于 2012-08-22T17:15:14.277 に答える
0

あなたの問題がどこにあるのかを言うのは難しいですが、次のコード行が主な問題だと思います:

newdoc.resume =Upload(resume = request.FILES['resume'])

モデル インスタンス全体を保存する前に、ファイルを FileField に明示的に保存する必要があります。また、モデルの 1 つに ForeignKey フィールドがあり、それを別のモデルのインスタンスに割り当てたい場合は、割り当てを行う前にまずそのインスタンスを保存してください。あなたのSeekersモデルを知らなくても、私にできることは、何が役立つかを推測することだけです. 次のようなものから始めることができます。

your_file = request.FILES['resume']
upload_instance = Upload()
upload_instance.resume.save(name=your_file.name, content=your_file, save=False)
upload_instance.user = ... # Here goes an instance of your Seekers model
upload_instance.save() # Here you save the whole instance of your Upload model

また、次の点に注意してください。

  1. モデルは、複数形ではなく単数形でSeekers命名する必要があります。Seekerこれは通常、すべてのモデルでそのようになるはずです。
  2. Python 関数は、常に小文字で開始する必要があります。つまりlistList. listただし、呼び出された関数が Python の標準ライブラリに既に存在するため、この名前はここではとにかく悪い選択です。

Django のドキュメントをよく見てください。あなたが知る必要があることはすべてそこにあります。特に次のセクションを読むことをお勧めします。

https://docs.djangoproject.com/en/1.4/ref/models/fields/#filefield

https://docs.djangoproject.com/en/1.4/ref/files/file/

于 2012-08-22T16:48:36.357 に答える