1

私は現在、最初の Django プロジェクトに取り組んでおり、既存のモデルに ImageField を追加することに関して障害にぶつかっています。

現在、コンテンツを投稿するユーザーのモデルと django-profiles のモデルがあります。前者の場合は、使用者がテキスト コンテンツに添付する写真を送信できるように、ImageField を追加しました。後者については、ユーザーがプロフィール写真をアップロードできるようにしたいと考えています (現時点では、アバターのサイズ変更については心配していません)。

両方のモデルに ImageFields を追加するまで、うまく機能していました。次に、データベースを South と同期しました。プロファイル用にかつて機能していたテンプレートを取得しようとしたときに得られた結果は次のとおりです。

「そのような列はありません: report_userprofile.profile_pic」

送信されたテキスト コンテンツを表示しようとすると、同様のエラーが発生します。

両方のフィールドを「blank=True」に設定したので、画像ファイルがなくてもエラーは発生しないように見えました。私は明らかに間違っています。

最初はこれらのフィールドをモデルに入れていませんでしたが、後から考えると大きな間違いでした。また、MEDIA_ROOT と MEDIA_URL を次のように設定しました。

MEDIA_ROOT = 'os.path.join(BASE_DIR, "media")'

MEDIA_URL = 'http://localhost:8000/media'

私が現在使用しているモデルは次のとおりです。

class Story(models.Model):
title = models.CharField(max_length=100)
topic = models.CharField(max_length=50)
copy = models.TextField()
author = models.ForeignKey(User)
zip_code = models.CharField(max_length=10)
latitude = models.FloatField(blank=False, null=False)
longitude = models.FloatField(blank=False, null=False)
date = models.DateTimeField(auto_now=True, auto_now_add=True)
pic = models.ImageField(upload_to='pictures', blank=True)   
def __unicode__(self):
    return " %s" % (self.title)

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=35)
email = models.EmailField()
birth_date = models.DateField(blank=True, null=True)
city = models.CharField(max_length=25)
state = models.CharField(max_length=20)
zip_code = models.CharField(max_length=10)
profile_pic = models.ImageField(upload_to='pictures', blank=True)

URL ファイルは次のように設定されます。

    url(r'^admin/', include(admin.site.urls)),

(r'^media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.MEDIA_ROOT},

ここでの中心的な問題は、エラーが何であるかわからないことです (以前のテンプレートも?)。または、さらに良いことに、エラーは、私がいくつか作成したと確信しているためです。結果として生じる苦痛とともに、今はちょっとしたスープです。

参考までに、PILをインストールしました。

この状況を改善するために私が何をする必要があるかについての洞察は、たとえ小さな洞察であっても、非常に高く評価されます. 同様の問題を検索しましたが、この特定のものはありません。(今後の最初の教訓は、最初にモデルを組み立てるときに、明らかに ImageFiles をセットアップすることです。)

どうもありがとう。

4

2 に答える 2

4

これは、データベースに存在しない列を追加した場合とまったく同じです (syncdb はデータベースの列を更新しません)。

これが django south に関する質問である場合は、それをタグに追加し、south で失敗したことについての背景を追加する必要があります。

これは南の簡単な操作である必要があります。

  1. ImageField をコメントアウトします
  2. 実行python manage convert_to_south myapp(またはmanage.py schemamigration myapp --initial、次にpython manage migrate myapp --fake)
  3. ImageField のコメントを外します。
  4. 走るpython manage schemamigration myapp --auto
  5. 走るpython manage migrate myapp

サウスなしで機能させようとしているだけなら、他に2つのオプションがあります..

データベースに列を手動で追加するか、データベース テーブルをリセットしますmanage.py reset myapp- すべてのデータを削除します。

コマンドを実行すると、DB を手動で変更するのは非常に簡単です。python manage.py sqlall myappテーブルの作成に使用された SQL が一覧表示されるためpython manage.py dbshell、キーを変換すると、不足しているフィールド行をコピーしてセッション (この場合は sqlite3) に貼り付けることができます。部分を変更テーブルステートメントに追加します。

于 2012-03-03T04:37:58.083 に答える
0

クラス構造を変更した場合は、データベースを再構築するか、データベース テーブルを変更して、クラスに加えた変更を反映する必要があります。エラーは、問題が何であるかを正確に示しています。列がテーブルにありません。syncdb はそれを行いません。それを行う最も簡単な方法は次のとおりです。

manage.py reset table_name

table_name は {app}_{class} です。これにより、現在のデータがすべて削除されます。その場でデータを変更したい場合は、使用しているデータベース シェル内で変更する必要があります。

于 2012-03-03T01:53:12.790 に答える