Python 我如何避免;“记录已存在”;Django 1.6中使用ModelForms的表单验证错误?

Python 我如何避免;“记录已存在”;Django 1.6中使用ModelForms的表单验证错误?,python,django,forms,django-forms,Python,Django,Forms,Django Forms,遵循文档并使用此模型: class ShippingLabel(models.Model): """Record what shipping lables were printed list""" class Meta: db_table = 'shipping_labels' ordering = ('client',) verbose_name = _('shipping label') verbose_name_plural = _('shipping la

遵循文档并使用此模型:

class ShippingLabel(models.Model):
"""Record what shipping lables were printed list"""
class Meta:
    db_table = 'shipping_labels'
    ordering = ('client',)
    verbose_name = _('shipping label')
    verbose_name_plural = _('shipping labels')

LAYOUT_LASER_2x2 = "1"
LAYOUT_TICKET = "2"
LAYOUT_LASER_1x1 = "3"
LAYOUT_CHOICES = (
    ( LAYOUT_LASER_1x1, _("Laser (1x1 sheet)") ),
    ( LAYOUT_LASER_2x2, _("Laser (2x2 sheet)") ),
    ( LAYOUT_TICKET, _("Ticket (3-inch wide)") ),
)

client = models.ForeignKey(Company, blank=False, null=False, unique=True, help_text=_("Which Client to ship to?"), verbose_name=_("client") )
store = models.ForeignKey(Store, blank=False, null=False, help_text=_("What store info should be used? (address, logo, phone, etc)"), verbose_name=_("store") )
packages = models.CharField(_("Packages"), max_length=30, blank=False, null=False, help_text=_("Total number of packages. One label printed per package.") )
preprinted_form = models.BooleanField(_("Pre-Printed Form"), default=False, help_text=_("Are you using pre-printed shipping label stickers?"), )
layout = models.CharField(_("Record Type"), max_length=10, blank=False, null=False, choices=LAYOUT_CHOICES, default=LAYOUT_LASER_1x1, help_text=_("Print on large labels (4 per Letter page), Laser large labels (1 per page), or ticket printer?") )
added_by = models.CharField(_("Added By"), max_length=30, blank=True, null=True, help_text=_("The User that created this order.") )
date_added = models.DateTimeField(_('Date added'), auto_now_add=True)
date_modified = models.DateTimeField(_('Date modified'), auto_now=True)

def get_absolute_url(self):
    return reverse('shipping:printship', args=[str(self.id)])

def __unicode__(self):
    return unicode(self.client)
我按照他们的示例(manual_label.html)制作了这个表单模板:

我的观点(包含大量诊断日志):

My forms.py定义:

class ShipLabelForm(ModelForm):
    class Meta:
        model = ShippingLabel
        localized_fields = '__all__'
        fields = '__all__'
        widgets = {
            'added_by': HiddenInput,
            'id': HiddenInput,
        }
我添加了'id':HiddenInput,以尝试“强制”将记录id号发送到表单,理论上我的错误是因为没有id号,Django将在“添加”模式下进行验证,这肯定会触发客户端上的“唯一”标志

手动标签视图由客户选择表单调用,传递客户id。目标是在当前没有为该客户定义装运标签的情况下生成一个添加表单,该表单有效

如果装运标签已经存在,我会预先加载表单及其数据。我的想法是,表单系统会自动对现有记录进行更新

无论哪种情况,保存的装运标签记录都用于生成所需的装运标签

这在管理视图中工作(使用站点视图)。但我想给用户一个更简单的系统。这适用于添加新标签。但是,当我试图编辑现有标签时,会出现一个表单验证错误“客户端已经存在”

这似乎是一件很容易做的事


那么,我在做错事时遗漏了什么呢?

在初始化表单时,无论是在POST还是GET块中,您都应该使用
实例
参数。

谢谢您的建议。我已经将instance=用于现有标签。我将视图中的新标签代码更改为也使用一个。我重新测试了,但仍然得到一个表单验证错误,即客户端已经存在。更新我发布的代码以包含您的建议。@RichardCooke:您更新的问题仍然没有显示正在为发布传递的实例。您是否在本地这样做,只是没有编辑您的问题以反映更改?如果没有,请尝试一下(请参阅)。您还需要记住在POST块中使用实例。Daniel和@Gregory:AHA!非常感谢你!!我想当我阅读Modelform.save()的文档时,我认为instance关键字只是一种预加载值的方法。我完全错过了这个微妙的动作!我将更新我的代码,使之符合当前的工作方式。再次感谢!!
from django.conf.urls import patterns, url

from shipping.views import printship, pcustomer, manual_label

urlpatterns = patterns('',
    url(r'pcust/', pcustomer, name='pcustomer'),
    url(r'mlabel/([0-9]+)/$', manual_label, name='manual_label'),
    url(r'printlabel/([0-9]+)/$', printship, name='printship'),
)
@login_required()
def manual_label(request, id):
    logger.debug("SHIPPING.VIEWS.manual_label")
    if request.method == 'POST':
        logger.debug("SHIPPING.VIEWS.manual_label: POST!")
        client = get_object_or_404(Company, pk=id)
        labelset = ShippingLabel.objects.filter(client=client)
        if len(labelset)>0:
            # Pre-existing label, update it:
            logger.debug("SHIPPING.VIEWS.manual_label.POST: Update a label!")
            label = labelset[0]
            form = ShipLabelForm(request.POST, instance=label)
        else:
            # New label:
            logger.debug("SHIPPING.VIEWS.manual_label.POST: Save New label!")
            form = ShipLabelForm(request.POST)
        if form.is_valid():
            logger.debug("SHIPPING.VIEWS.manual_label.POST: form is valid")
            label = form.save(commit=True)
            logger.debug("SHIPPING.VIEWS.manual_label.POST: label pk: " + str(label.id) )
            logger.debug("SHIPPING.VIEWS.manual_label.POST: label client name: " + str(label.client.name) )
            logger.debug("SHIPPING.VIEWS.manual_label: post return")
            return HttpResponseRedirect(reverse('shipping:printship', args=[str(label.id)]))
    else:
        logger.debug("SHIPPING.VIEWS.manual_label: GET!")
        client = get_object_or_404(Company, pk=id)
        labelset = ShippingLabel.objects.filter(client=client)
        if len(labelset)>0:
            # Pre-existing label, load it:
            logger.debug("SHIPPING.VIEWS.manual_label: Pre-Existing label, load it...")
            label = labelset[0]
            form = ShipLabelForm(instance=label)
        else:
            # New label:
            label = ShippingLabel(client=client,
                                store=request.user.employee.store,
                                added_by=request.user.get_username())
            form = ShipLabelForm(instance=label)
    logger.debug("SHIPPING.VIEWS.manual_label: get return")
    return render(request, 'shipping/manual_label.html', {
                                             'title': u"Creación de etiquetas Manual Envios",
                                             'form': form,
                                             })
class ShipLabelForm(ModelForm):
    class Meta:
        model = ShippingLabel
        localized_fields = '__all__'
        fields = '__all__'
        widgets = {
            'added_by': HiddenInput,
            'id': HiddenInput,
        }