0

次のように、特定のオブジェクトを作成しているユーザーをデータベースに保存する必要があります。

(models.py)

class Address(models.Model):
createdBy = models.ForeignKey(User)
address1 = models.CharField("Address Line 1", max_length=40)
address2 = models.CharField("Address Line 2", max_length=40, blank=True)
city = models.CharField(max_length=20)
state = models.CharField(max_length=3)
zipCode = models.CharField("Postal Code", max_length=10)

フォームを処理するための私のビューはここにあります(views.py):

def handlePopAdd(request, addForm, field):
if request.method == "POST":
    form = addForm(request.POST)
    if form.is_valid():
        try:
            newObject = form.save(request)
        except forms.ValidationError, error:
            newObject = None
        if newObject:
            return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>'% (escape(newObject._get_pk_val()), escape(newObject)))
else:
    form = addForm()
pageContext = {'form': form, 'field': field}
return render_to_response("address_popup.html", pageContext, context_instance=RequestContext(request))

そして最後に、これが私のフォームコードです: (forms.py)

class AddressForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    return super(AddressForm, self).__init__(*args, **kwargs)

def save(self, *args, **kwargs):

    obj = super(AddressForm, self).save(commit=False)
    if self.request:
        obj.createdBy = self.request.user
    obj.save()

class Meta:
    model = Address
    exclude = ('createdBy',)

私はこの質問で提案されたトップの回答を使用していますが、数時間この穴を見つめた後、壁にぶつかりました。

これが私のトレースバックです。エラーは/app/address/add/ の IntegrityError です (1048、「Column 'createdBy_id' cannot be null」)

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)
File "/home/matthew/lessonhelper/../lessonhelper/lessons/views.py" in address_add
  78.   return handlePopAdd(request, AddressForm, 'address')
File "/usr/local/lib/python2.6/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)
File "/home/matthew/lessonhelper/../lessonhelper/lessons/views.py" in handlePopAdd
  66.               newObject = form.save(request)
File "/home/matthew/lessonhelper/../lessonhelper/lessons/forms.py" in save
  29.       obj.save()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py" in save
  460.         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py" in save_base
  553.                     result = manager._insert(values, return_id=update_pk, using=using)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py" in _insert
  195.         return insert_query(self.model, values, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in insert_query
  1436.     return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in execute_sql
  791.         cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in execute_sql
  735.         cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py" in execute
  34.             return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/mysql/base.py" in execute
  86.             return self.cursor.execute(query, args)
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py" in execute
  166.             self.errorhandler(self, exc, value)
File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py" in defaulterrorhandler
  35.     raise errorclass, errorvalue

Exception Type: IntegrityError at /app/address/add/
Exception Value: (1048, "Column 'createdBy_id' cannot be null"
4

2 に答える 2

2

リクエストをフォームに追加するロジックを明確に定義しましたが、それを使用していません。

request(コードに従って)キーワード引数としてフォームをインスタンス化する必要があります。

form = addForm(request.POST, request=request)

save(request)リクエストに対して何もしません。

ほとんどの人は、新しい引数を単に受け入れることを好みますsave()

def save(self, request):
    obj = super(AddressForm, self).save(commit=False)
    obj.createdBy = request.user
    obj.save()

最後にif、save メソッドのブロック内でcreatedByが null 可能でない場合は意味がありません: 必須です。それについて「もし」はありません。

于 2012-06-27T01:26:47.193 に答える
0

フォームのフィールドを除外しcreatedByました。モデル定義によれば、ModelForm を使用しているため、必須フィールドです。

于 2012-06-27T01:13:15.397 に答える