【问题标题】:Django form does not save to database neither does it forward correctly upon POSTDjango 表单不会保存到数据库,也不会在 POST 时正确转发
【发布时间】:2017-05-31 18:56:54
【问题描述】:

我不明白为什么我的一个表单在提交时没有保存或转发。

这是模型:

class Offer(models.Model):
    """ local offers traveler to take her out based on the trips listed by traveler """
    local = models.ForeignKey(User, related_name='local_offers_excursion')
    message = models.CharField(max_length=500)
    trip = models.ForeignKey(Excursion, related_name='traveler_trip')
    traveler_approval = models.BooleanField(blank=True)

这是表格:

class OfferExcursionForm(forms.ModelForm):
    def __init__(self, traveler=None, city=None, **kwargs):
        super(OfferExcursionForm, self).__init__(**kwargs)
        if traveler and city:
            self.fields['trip'].queryset = Excursion.objects.filter(traveler=traveler)
            self.fields['trip'].queryset = Excursion.objects.filter(city=city)
    class Meta:
        model = Offer
        exclude = ('local', 'traveler_approval')

这是另一个相关模型(游览):

class Excursion(models.Model):
    """traveler lists his trips so local could see them and possibly offer to take him out"""
    traveler = models.ForeignKey(User, related_name='traveler_lists_excursion')
    city = models.ForeignKey(City, related_name='visited_city', blank=True, null=True) #Each excursion is connected to one City.
    city_search_text = models.CharField(blank=True, max_length=300)
    message = models.CharField(max_length=500)#message to all locals of that city "Hey good people of Edinburgh!"
    date = models.DateField()

    def __str__(self):
        return self.traveler.first_name.title() + " " + self.traveler.last_name.title() + "'s trip to " + self.city.name + " on " + str(self.date)

这是视图:

def offerexcursion(request, username):
    traveler = User.objects.get(username=username)
    if request.method == 'POST':
        offer_excursion_form = OfferExcursionForm(request.POST)
        if offer_excursion_form.is_valid():
            offer = offer_excursion_form.save(commit=False)
            offer.local = request.user
            offer.traveler_approval = True
            offer.save()
            if 'next' in request.GET:
                return redirect(request.GET['next'])
        else:
            print(offer_excursion_form.errors)
    else:

        offer_excursion_form = OfferExcursionForm(traveler=traveler, city=request.user.profile.city)
    return render(request, '<app_name>/offerexcursion.html', {'offer_excursion_form':offer_excursion_form})

最后这是模板:

<h1>Offer an Excursion to a Traveler</h1>

<form method="post" action="?next=/dashboard/" enctype="multipart/form-data">
            {% csrf_token %}

    {{ offer_excursion_form|crispy }}

    <input type="submit" value="Submit" class="btn btn-primary btn-lg "/>

</form>

提交表单后,不会保存 Offer 对象,它会再次转发到表单而不是仪表板页面。它转发到这个链接:

http://127.0.0.1:8000/offerexcursion/<username>/?next=/dashboard/

代替:

http://127.0.0.1:8000/dashboard/

【问题讨论】:

    标签: python django django-models django-forms views


    【解决方案1】:

    您已更改__init__ 方法的签名。

    def __init__(self, traveler=None, city=None, **kwargs):
    

    因此,当你有OfferExcursionForm(request.POST)时,它就等价于OfferExcursionForm(traveler=request.POST)

    您可以将数据作为关键字参数传递:

    if request.method == 'POST':
        OfferExcursionForm(data=request.POST)
    

    但是,您可能希望提供travelercity,否则表单将使用未过滤的trip 查询集进行验证。

    if request.method == 'POST':
        offer_excursion_form = OfferExcursionForm(traveler=traveler, city=request.user.profile.city, data=request.POST)
    

    最后,您的第二个查询集替换了第一个,因此您没有在 traveler 上过滤它。

        if traveler and city:
            self.fields['trip'].queryset = Excursion.objects.filter(traveler=traveler)
            self.fields['trip'].queryset = Excursion.objects.filter(city=city)
    

    你可能想要

    if traveler and city:
        self.fields['trip'].queryset = Excursion.objects.filter(city=city, traveler=traveler)
    

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 2020-08-29
      • 2012-07-16
      • 1970-01-01
      • 2016-08-16
      • 2021-10-04
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多