在Django中,我如何从数据库中选择一个对象,并将参数传递给其他更好的方式,而不是URL?

nwnhqdif  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(98)

我是Django的新手,在一个页面中,我有一个组合框,由数据库中的字段填充(简单的城市名称)。我从数据库中选择一个对象,并将参数传递给url。我知道这不是最干净的方法,还有更好的方法。
有没有更好的方法来填充组合框而不向url传递数据库参数?一种更简洁的方法,然后以不同的更好的方式传递参数。我的代码如何采用不同的方法?谢谢你

models.py

from django.db import models 

class City(models.Model): 
    name = models.CharField(max_length=30) 

    def __str__(self):
        return self.name

forms.py

from .models import City

class SelectCityForm(forms.Form):
    city = forms.ModelChoiceField(queryset=City.objects.all())

    class Meta:
        model = City
        fields = ('name')

views.py

def city_detail(request):
    form = CitySelectForm()
    object = None
    if request.method == "POST":
        form = CitySelectForm(request.POST)
        if form.is_valid():
            city_id = form.cleaned_data['city']
            object = City.objects.get(id=city_id)

    context = {'form': form, 'object': object}
    return render(request, 'app1/home.html', context)

首页.html

<form action="/url-to-city_detail-view/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

url.py

from django.urls import path, include
from . import views
from app1.views import index   
from app1 import views

urlpatterns = [
    path('', index, name='index'), #Aggiunto per combobox
    path('login/', views.sign_in, name='login'),
    path('logout/', views.sign_out, name='logout'),

    path('home/', views.home, views.city_detail, name='home'),
 ]
kninwzqo

kninwzqo1#

现在你传递参数到URL。您正在传递参数,因此POST请求标头。这意味着,在您当前的设置中,当您在表单中选择“New York”并提交时,您只能访问城市“纽约”的详细视图,对吗?
传递参数到url意味着每个城市都有自己的详细信息站点。这意味着您可以通过“www.example.com”访问城市“纽约”www.your-website.com/new-york/detail,通过“www.example.com”访问“柏林”www.your-website.com/berlin/detail。这允许您在用户知道URL的情况下不强制用户使用表单。这也允许您动态链接到这些城市的详细视图。
它从您的www.example.com开始urls.py

# urls.py
from app1.views import index, city_detail

urlpatterns = [
    path('<int:id>/city/', city_detail, name='detail'),
    # [...]
 ]
from django.db import models 

class City(models.Model): 
    name = models.CharField(max_length=30) 

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return "/%i/detail/" % self.id

然后调整城市的细节视图

# views.py
def city_detail(request, id):
    c = City.objects.get_object_or_404(id=city_id)
    context = {'city': c}
    return render(request, 'app1/home.html', context)

def city_select_view(request):
    form = CitySelectForm()
    if request.method == "POST":
        form = CitySelectForm(request.POST)
        if form.is_valid():
            city_id = form.cleaned_data['city']
            object = City.objects.get_object_or_404(id=city_id)
            return redirect(object)

    context = {'form': form, 'object': object}
    return render(request, 'app1/home.html', context)

所以超级酷的优势是,现在你不必使用的形式,因为你也可以只使用一个直接链接到城市!

<a href="{% url 'app1:detail' id=5 %}">New York</a>

对于进一步的阅读,我建议使用django教程中的this part。这是Django的第一步。

相关问题