While we're at it, here are a few suggestions.
So long as you can, you should use unicode inside python code. The main
logic would be that input should be converted to unicode as soon as
possible, and that output should be encoded (likely to UTF-8) as late as
possible.
Consequently, you might want to rewrite your invoice methods so that they do
the following.
invoice_number = unicode(self.created_at.year) + u'/' + unicode(self.id)
You could also write this the following way:
return u'{0}/{1}'.format( self.created_at.year, self.id ), which would be
more elegant (if you use format with a unicode string it calls your object's
__unicode__ method, and if you use format with a string, it calls the
__str__ method.).
By the way, your __unicode__ method actually returns your invoice's
invoice_number, so you might want to have __unicode__ return
self.invoice_number().
You could even use a single method for both in your code, but that might not
be a very good idea: if one day you want to change your display, if you have
__unicode__ return self.invoice_number() you can change it.
Regarding your test code, you will need to add a few details I didn't point
out first.
None of your fields have "blank = True", so you're going to have to either
give them default values or give them actual values in your tests.
Hope this helps.
Thomas
2011/8/26 Torsten <[email protected]>
> Hi
>
> I have the following model:
>
> class Invoice(models.Model):
> customer = models.ForeignKey(Customer)
> project = models.ForeignKey(Project, blank=True, null=True)
> sum = models.FloatField(default=0)
> tax = models.IntegerField(default=16)
> payed_at = models.DateField(blank=True, null=True)
> payable_at = models.DateField('payable at')
> created_at = models.DateTimeField(auto_now_add=True)
>
> def invoice_number(self):
> invoice_number = str(self.created_at.year) + '/' +
> str(self.id)
> return invoice_number
>
> def __unicode__(self):
> return unicode(str(self.created_at.year) + '/' + str(self.id))
>
> class InvoiceItem(models.Model):
> invoice = models.ForeignKey(Invoice)
> text = models.TextField()
> unit = models.CharField(max_length=255)
> amount = models.IntegerField()
> sum = models.FloatField()
>
> and try to run this test
>
> def test_save_invoice(self):
> InvoiceItem.objects.create(sum=12, unit='Stunde', amount=100)
> InvoiceItem.objects.create(sum=10, unit='Stunde', amount=120)
> invoice = Invoice.objects.create(created_at="2011-07-28",
> customer_id=1, payable_at='2012-12-12')
> invoice.invoiceitem_set.all()
> self.assertEqual(240, invoice.sum)
>
> with this error:
> IntegrityError: invoice_invoiceitem.invoice_id may not be NULL
>
> since it is the relation id Django should take care for the
> invoice_invoiceitem.invoice_id
>
> Or is there anything wrong with the code ?
>
> Torsten
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.
>
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.