0

ユーザーがhtmlテーブル(レコード)にリストされたアイテムから選択できるように設計された単純なビュー機能があります。レコードをクリックすると、ユーザーはその特定のレコードを編集できるテンプレートに誘導されます。コードは次のとおりです。

def edit_record(request):
        if request.method == 'POST':
                a=ProjectRecord.objects.get()
                form = RecordForm(request.POST, instance=a)
                if form.is_valid():
                        form.save()
                        return HttpResponseRedirect('/')
        else:
                a=ProjectRecord.objects.get()
                form = RecordForm(instance=a)
        return render_to_response('productionModulewire.html', {'form': form})

問題は、データベースにレコードが 1 つしかない場合にのみ、関数が完全に機能することです。別のものを追加するとすぐに、複数の返品エラーが発生します。「objects.get()」と関係があると思われますが、ビューを正しく構成する方法がわかりませんか?

URL は単純です (おそらくやりすぎです)。

(r'^edit/', edit_record),

モデルは次のようになります。

class ProjectRecord(models.Model): 
    client = models.CharField(max_length=50, choices=CLIENT_CHOICES)
    account = models.CharField(max_length=50, choices=ACCOUNT_CHOICES)
    project_type = models.CharField(max_length=50, choices=TYPE_CHOICES)
    market = models.CharField(max_length=50, choices=MARKET_CHOICES)
    agencyID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    clientID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    prjmanager = models.CharField(max_length=64, unique=False, blank=True, null=True)
    acclead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    artdirector = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prdlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    intlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prjname = models.CharField(max_length=200, unique=True)
    prjstatus = models.CharField(max_length=50, choices=STATUS_CHOICES)
    as_of = models.DateField(auto_now_add=False)
    format = models.CharField(max_length=64, unique=False, blank=True, null=True)
    target_studio = models.DateField(unique=False, blank=True, null=True)
    mech_return = models.DateField(unique=False, blank=True, null=True)
    comp_return = models.DateField(unique=False, blank=True, null=True)
    target_release = models.DateField(unique=False, blank=True, null=True)
    record_added = models.DateField(auto_now_add=True)
    record_modified = models.DateTimeField()
    studio_name = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio = models.DateTimeField(unique=False, blank=True, null=True)
    studio_name2 = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process2 = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    comments = models.TextField(max_length=500, unique=False, blank=True, null=True)
    summary = models.TextField(max_length=500, unique=False, blank=True, null=True)
    upload_pdf = models.CharField(max_length=50, unique=False, blank=True, null=True)
    upload_achive = models.CharField(max_length=50, unique=False, blank=True, null=True)

    def __unicode__(self):
        return u'%s' % self.prjname

    class Admin: 
        pass

そこからモデルフォーム「RecordForm」が派生しました。

4

2 に答える 2

2

重要なことgetは、「何を手に入れるか」です。

あなたが言う時

a=ProjectRecord.objects.get()

あなたは選択基準を提供することを怠りました。データベースからどの行が必要ですか?

どの行?うーん...GETトランザクションはどの行が編集されるかをどうやって知るのでしょうか?

通常、それを URL に入れます。

urls.pyそのため、URL パスにレコード ID を含めるようにを更新する必要があります。このレコード ID を受け入れるには、ビュー関数の定義を更新する必要があります。最後に、URL から取得したこのレコード ID を使用するように GET と POST を更新する必要があります。


urls.pyオブジェクト ID を含めるように更新します。http://docs.djangoproject.com/en/1.1/topics/http/urls/#named-groupsを参照してください。

urlpatterns = patterns('',
    (r'^class/(?P<object_id>\d+?)/$', 'app.views.edit_record'),

ビュー関数を更新する

def edit_record( request, object_id = None ):
    if request.method == "POST":
        if object_id is None:
            return Http_404
        ProjectRecord.objects.get( pk = int(object_id) )

    etc.
于 2009-12-22T15:32:48.170 に答える
0

これ以上の情報がなければ、何を変更する必要があるかを判断するのは困難ですが、あなたの推測は正しいです。問題はProjectRecord.objects.get()呼び出しにあります。

リストを 1 つに制限するには、何らかの情報を渡して取得する必要があります。

ほとんどの場合、次のものが必要になります。

ProjectRecord.objects.get(pk=id)  

編集しようとしているidの主キーの値はどこですか。ProjectRecord

関連するコードとモデルurls.pyに関する詳細情報を表示できますか?ProjectRecord

于 2009-12-22T15:32:17.623 に答える