簡體   English   中英

Django save()未將表單保存到數據庫

[英]Django save() is not saving form to database

您好,我在將表單保存到數據庫時遇到問題。 當我嘗試在ads_history_add視圖中保存AdHistoryForm時格式正確呈現,但是提交后,除了將我重定向到ads_history_list視圖外,什么都沒有發生。

另外,當我嘗試使用空白字段提交此表單時,它沒有顯示任何錯誤(我將它們包括在模板中),因此也許是驗證性的事情。

當我嘗試在ads_add視圖中添加廣告時 ,一切正常。

你能幫助我嗎?

models.py

from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User


class Ad(models.Model):
    title = models.CharField(max_length=128, verbose_name=_("name"), help_text=_("required"), unique=True)
    content = models.TextField(verbose_name=_("content"), blank=True)
    url = models.URLField(verbose_name=_("website"), blank=True)
    date_create = models.DateTimeField(auto_now_add=True)
    date_modify = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.title


class AdHistory(models.Model):
    ad = models.ForeignKey(Ad)
    user = models.ForeignKey(User)
    comment = models.TextField(verbose_name=_("comment"), help_text=_("required"))
    date_create = models.DateTimeField(auto_now_add=True)
    date_modify = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.comment

表格

from django import forms

from .models import Ad, AdHistory


class AdForm(forms.ModelForm):
    class Meta:
        model = Ad
        fields = ['title', 'content', 'url']


class AdHistoryForm(forms.ModelForm): 
    class Meta:
        model = AdHistory
        fields = ['comment']

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from django.utils.translation import ugettext as _

from .models import Ad, AdHistory
from .forms import AdForm, AdHistoryForm   



@login_required
@user_passes_test(lambda u: u.is_superuser)
def ads_list(request):
    ads_list = Ad.objects.all().order_by('-date_modify')
    context = {'list': ads_list}
    return render(request, 'ads_list.html', context)

@login_required
@user_passes_test(lambda u: u.is_superuser)
def ads_add(request):
    form = AdForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('ads_list')
    context = {'form': form}
    return render(request, 'ads_form_add.html', context)

@login_required
@user_passes_test(lambda u: u.is_superuser)
def ads_history_list(request, ad_id):
    ad = get_object_or_404(Ad, pk=ad_id)
    history_list = AdHistory.objects.select_related().filter(ad=ad).order_by('-id')
    context = {'list': history_list, 'object': ad}
    return render(request, 'ads_history_list.html', context)

@login_required
@user_passes_test(lambda u: u.is_superuser)
def ads_history_add(request, ad_id):
    ad = get_object_or_404(Ad, pk=ad_id)
    f = AdHistoryForm(request.POST or None)
    if f.is_valid():
        new_entry = f.save(commit=False)
        new_entry.ad = ad
        new_entry.user = request.user
        new_entry.save()
        return redirect('ads_history_list', ad_id)
    context = {'form': f, 'object': ad}
    return render(request, 'ads_history_add.html', context)

urls.py

rom django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required

from ads import views

urlpatterns = patterns(
    '',
    url(r'^$', views.ads_list, name="ads_list"),
    url(r'^add/', views.ads_add, name="ads_add"),
    url(r'^(?P<ad_id>\d+)/history/$', views.ads_history_list, name="ads_history_list"),
    url(r'^(?P<ad_id>\d+)/history/add$', views.ads_history_add, name="ads_history_add"),
)

這兩個表單模板都從該模板繼承:

<form role="form" method="post" action=".">

    {% csrf_token %} 

    <table class="table table-bordered crm-form">

        {% for field in form.visible_fields %} 

        <tr>
            <th>
                {{ field.label }}
            </th>
            <td>
                {{ field }}

                <small>{{ field.help_text }}</small>

                {% if field.errors %}
                <div class="alert alert-danger" role="alert">{{ field.errors }}</div>
                {% endif %}

            </td>

        </tr>

        {% endfor %}
    </table>

     <button type="submit" name="submit" class="btn btn-success crm-float-right">
        {% trans 'Save' %}
    </button>

</form>

POST請求永遠不會到達您的ads_history_add視圖,因為您的ads_history_add網址格式沒有斜杠。 如果沒有斜杠,請使用action="." ads_form_add.html模板中的結果導致對(?P<ad_id>\\d+)/history/

添加尾部斜杠,所有內容均應按預期工作。 另外,您可以省略action屬性,以告訴瀏覽器將POST張貼到當前URL。

另請注意,盡管此處不相關,但顯示{{ form.non_field_errors }}可能是一個好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM