0

ユーザーが車両のプレートを選択するフィールドがあり、この選択に従って、フォームに vehicle-table(query: ) からデータを入力したいと考えていますvehicle = Vehicles.objects.get(plate=plate)。私はこのビューでこれを管理します:

def vehicles_archive(request):
    user = request.user
    user_id = user.id 
    u_id = user_id

    vehicles = Vehicles.objects.filter(own_id1 = u_id)
    if request.method == 'POST':
        plate = request.POST.get('searchPlate')
        vehicle = Vehicles.objects.get(plate=plate)

        form = VehiclesForm(data=request.POST, instance=vehicle, own_id=u_id)
        if form.is_valid():
            form.save()
            return render_to_response('success.html', locals(), context_instance= RequestContext(request))
        else:
            vehicles = Vehicles.objects.filter(own_id1 = u_id)
            vehicle = Vehicles.objects.get(plate=plate)
            form = VehiclesForm(instance=vehicle, own_id=u_id)

    return render_to_response('vehiclesArchive.html', locals(), context_instance= RequestContext(request))

すべて正常に動作しているように見えますが、フォーム フィールドを編集してフォームを送信しようとすると、「Vehicles matching query does not exist.」というメッセージが表示されます。クエリをプレートで示します。使用しているロジックにエラーがあるはずですが、どうすれば解決できますか?または、上記の機能を実現するための望ましい方法はありますか?

編集:

class Vehicles(models.Model):
    id = models.DecimalField(primary_key=True, unique=True, max_digits=127, decimal_places=0)
    plate = models.CharField(max_length=80, unique=True)
    tempflag = models.BooleanField()
    vht_id = models.ForeignKey('Vehtypes', null=True, db_column='vht_id',  blank=True)
    vlength = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vwidth = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vheight = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vnetweight = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    vmaxload = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    axleno = models.DecimalField(null=True, max_digits=127, decimal_places=0, blank=True)
    chassis = models.CharField(max_length=160, blank=True)
    man_id = models.ForeignKey('Manufacturers', null=True, blank=True, db_column='man_id')
    own_id1 = models.ForeignKey('Owners', null=True, db_column='own_id1', related_name='veh_own_id1', blank=True)
    own_id2 = models.ForeignKey('Owners', null=True, db_column='own_id2',related_name='veh_own_id2', blank=True)
    ins_id = models.ForeignKey('Insurancecompanies', null=True, blank=True, db_column='ins_id')
    modelno = models.CharField(max_length=160, blank=True)
    checkflag = models.BooleanField()

    def __unicode__(self):
        return self.plate 

    class Meta:
        db_table = u'vehicles'
        ordering = ['plate']

一方、searchPlate は、ユーザーの選択を取得するためだけにレンダリングされるランダム フィールドです。所有者モデルの定義は重要ではないと思います。

4

2 に答える 2

0

私が理解していない何か:

ユーザーが車両のプレートを選択するフィールドがあります

これはどこで起こりますか?あなたが投稿したビューコードで?

ここでは、1 段階ではなく 2 段階のプロセスのように見えるためです。

a) ユーザーがvehicles_archiveビューからリストから選択します。このビューは、このユーザーが所有する車両を表示するためだけのものであるため、GET リクエストのみを処理します。このビューの URL は のようになりますr'^vehicles/$'。リストはエントリのセットで、各エントリはそれぞれの車両へのリンクで構成されます。例えば/vehicles/YKH4034/。したがって、urls.py のような別の URL 正規表現が必要r'^vehicles/(?P<plate>\w{80})/$'です。そして、この URL を処理する別のビュー。たとえば、名前が付けられますvehicles_archive_detail

b) ユーザーは編集したい車両を選択し、現在は によってサービスされていvehicles_archive_detailます。このビューは、GET 要求と POST 要求の両方を処理します。特定の車両のフォームを表示するための GET と、所有者が実際に車両を変更 (フォームを送信) するための POST。

ただし、この種のロジックはコードに表示されません。または、問題を十分に理解していない可能性があります。

アップデート:

searchGET パラメータ (searchPlate) もボタンも必要ありません。フォームではありません。vehicle_archive ビューには、次のようなテンプレートがあります。

{% extends 'somebaseview.html' %}

{% block content %}
    <ul>
    {% for vehicle in owner_vehicles %}
        <a href="/vehicles/{{ vehicle.plate }}/"> {{ vehicle.plate }} </a>
    {% endfor %}
    </ul>
{% endblock %}

したがって、ユーザーはリンクをクリックするだけで、編集したい特定の車両に移動できます。

更新 2:

あなたは、ドロップダウン メニューと検索ボタンが必要だと言います。ただし、検索機能が表示されません。フォームが見つからない可能性はありますか?彼が検索を「ヒット」したときに、複数の結果 (車両) が存在する可能性はありますか?

いずれにせよ、それが本当に必要なものなら。私は2つの方法を見ます:

1) Javascript と AJAX を使用してこれらすべてを行います。ここで例を表示するのは難しいですが、非常に長くなり、元の質問の範囲外になるためです。

2) django のフォーム ウィザードツールを使用します。

いずれにしても、2 番目のステップ (ユーザーが特定の車両を表示/編集する) が機能することを確認することから始めて、ステップ 1 からステップ 2 への移行方法を決定します。つまり、Ajax またはフォーム ウィザードです。

于 2012-09-05T13:28:58.790 に答える
0

問題は、オブジェクト自体ではなく、ID で外部キーを検索していることです。たとえば、次のようにします。

vehicles = Vehicles.objects.filter(own_id1 = u_id) 

と比較するには、整数ではなくインスタンスown_id1を渡す必要があります。UserIDで検索したい場合は、次のようにする必要があります。

vehicles = Vehicles.objects.filter(own_id1_id = u_id)

これは、名前に in を含む外部キーに名前を付けてはならない理由も示しています_id。データベース レベルでは、Django は自動的に を追加し_idます。

于 2012-09-05T14:35:34.363 に答える