django在表单中显示来自相关模型的字段

4dbbbstv  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(120)

我就是不明白我一直在阅读,但我甚至没有接近找到答案。这很可能非常容易。我有两个模型人(姓名和邮政编码)和邮政编码(邮政编码和城市)。
当注册一个新的人时,应输入字段名称和邮政编码。当zipcode输入相关的正确的城市从Zipmodel应显示
models.py

class Zip(models.Model):
        zipcode = models.IntegerField()
        city = models.CharField(max_length=200)
    
        def __str__(self):
            return str(self.zipcode)
    
    class Person(models.Model):
        name = models.CharField(max_length=200)
        zipcode =  models.ForeignKey('Zip',on_delete=models.CASCADE,)  
    
        def __str__(self):
            return self.name

字符串
forms.py

from django import forms 
    from .models import Zip, Person
    
    class PersonForm(forms.ModelForm):
        class Meta:
            model = Person
            fields = ('name', 'zipcode',)
            
    class ZipForm(forms.ModelForm):
        class Meta:
            model = Zip
            fields = ('zipcode', 'city',)


views.py

from django.shortcuts import render, redirect, get_object_or_404
    from .forms import PersonForm, ZipForm
    from .models import Zip, Person
    
    def index(request):
        return render(request, 'theapp/index.html' )
    
    def person_new(request):
        if request.method == "POST":
            form = PersonForm(request.POST)
    
    
            if form.is_valid():
                post = form.save(commit=False)
    
                post.save()
                return redirect('person_detail', pk=post.pk)
            
        else:
            form = PersonForm()
        return render(request, 'theapp/person.html', {'form': form})
    
    def zip_new(request):
        if request.method == "POST":
            form = ZipForm(request.POST)
            
    
            if form.is_valid():
                post = form.save(commit=False)
                post.save()
                return redirect('zip_detail', pk=post.pk)
        else:
            form = ZipForm()
        return render(request, 'theapp/zip.html', {'form': form})
    
    
    
    def person_detail(request, pk):
        post = get_object_or_404(Person, pk=pk)
        return render(request, 'theapp/person_detail.html', {'post': post})
    
    def zip_detail(request, pk):
        post = get_object_or_404(Zip, pk=pk)
        return render(request, 'theapp/zip_detail.html', {'post': post})


person.html

{% block body %}
        <section>
            <h2>new person</h2>
               </section>
    
               
               <form method="POST" class="person-form">{% csrf_token %}
                {{ form.as_p }}
                <button type="submit" class="save btn btn-secondary">Save person</button>
            </form>
    
    
    {% endblock %}


这就是我想要的样子。输入邮政编码时。纽约显示。


的数据
我会非常感谢任何帮助或指引我在正确的方向。
谢谢你的好意

ioekq8ef

ioekq8ef1#

基本上,您可以在forms.py中执行以下操作:

from django import forms
    from .models import Zip

    class PersonForm(forms.ModelForm):
        zipcode = forms.ModelChoiceField(queryset=Zip.objects.all(),
                                         empty_label="select zip code",
                                         to_field_name="name")

字符串
然后在您的模板上,您必须看到显示的城市,而不是您的邮政编码,您可以看到显示的城市名称。
这是最简单和最干净的方法。其他的方法会非常复杂。

相关问题