newforms: Implemented formfield() for database ForeignKey class and added unit tests

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4247 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-12-27 05:23:21 +00:00
parent d853278253
commit 6a75c8a52e
2 changed files with 24 additions and 2 deletions

View File

@ -361,7 +361,7 @@ def create_many_related_manager(superclass):
old_ids = set([obj._get_pk_val() for obj in objs]) old_ids = set([obj._get_pk_val() for obj in objs])
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \ cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \
(self.join_table, source_col_name, (self.join_table, source_col_name,
target_col_name, ",".join(['%s'] * len(old_ids))), target_col_name, ",".join(['%s'] * len(old_ids))),
[self._pk_val] + list(old_ids)) [self._pk_val] + list(old_ids))
transaction.commit_unless_managed() transaction.commit_unless_managed()
@ -548,6 +548,9 @@ class ForeignKey(RelatedField, Field):
def contribute_to_related_class(self, cls, related): def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related)) setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
def formfield(self):
return forms.ChoiceField(choices=self.get_choices_default(), required=not self.blank, label=capfirst(self.verbose_name))
class OneToOneField(RelatedField, IntegerField): class OneToOneField(RelatedField, IntegerField):
def __init__(self, to, to_field=None, **kwargs): def __init__(self, to, to_field=None, **kwargs):
try: try:

View File

@ -20,9 +20,16 @@ class Category(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
class Writer(models.Model):
name = models.CharField(maxlength=50)
def __str__(self):
return self.name
class Article(models.Model): class Article(models.Model):
headline = models.CharField(maxlength=50) headline = models.CharField(maxlength=50)
pub_date = models.DateTimeField() pub_date = models.DateTimeField()
writer = models.ForeignKey(Writer)
categories = models.ManyToManyField(Category) categories = models.ManyToManyField(Category)
def __str__(self): def __str__(self):
@ -101,12 +108,24 @@ Traceback (most recent call last):
... ...
ValueError: The Category could not be created because the data didn't validate. ValueError: The Category could not be created because the data didn't validate.
ManyToManyFields are represented by a MultipleChoiceField. Create a couple of Writers.
>>> w = Writer(name='Mike Royko')
>>> w.save()
>>> w = Writer(name='Bob Woodward')
>>> w.save()
ManyToManyFields are represented by a MultipleChoiceField, and ForeignKeys are
represented by a ChoiceField.
>>> ArticleForm = form_for_model(Article) >>> ArticleForm = form_for_model(Article)
>>> f = ArticleForm(auto_id=False) >>> f = ArticleForm(auto_id=False)
>>> print f >>> print f
<tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr> <tr><th>Headline:</th><td><input type="text" name="headline" maxlength="50" /></td></tr>
<tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr> <tr><th>Pub date:</th><td><input type="text" name="pub_date" /></td></tr>
<tr><th>Writer:</th><td><select name="writer">
<option value="" selected="selected">---------</option>
<option value="1">Mike Royko</option>
<option value="2">Bob Woodward</option>
</select></td></tr>
<tr><th>Categories:</th><td><select multiple="multiple" name="categories"> <tr><th>Categories:</th><td><select multiple="multiple" name="categories">
<option value="1">Entertainment</option> <option value="1">Entertainment</option>
<option value="2">It&#39;s a test</option> <option value="2">It&#39;s a test</option>