Opened 17 years ago
Closed 15 years ago
#8890 closed (invalid)
Inline model formsets break validation for unique_together with foreign keys
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Forms | Version: | 1.0 |
| Severity: | Keywords: | ||
| Cc: | bronger@… | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I currently have the following forms:
class PrefSheetForm(ModelForm):
DESIRED_INTS = zip(range(1, 5), range(1, 5))
desired_dances = fields.TypedChoiceField(choices=DESIRED_INTS, coerce=int)
class Meta:
model = PrefSheet
exclude = ('user','show', 'audition_number',)
class Media:
js = ('js/jquery.js', 'js/prefsheet.js',)
class PrefForm(ModelForm):
class Meta:
model = Pref
PrefFormSet = inlineformset_factory(PrefSheet, Pref, form=PrefForm, extra=2)
and the relevant models:
class PrefSheet(models.Model):
audition_number = models.IntegerField(blank=True, null=True)
user = models.ForeignKey(auth.models.User, related_name='prefsheets')
conflicts = models.TextField(blank=True)
desired_dances = models.PositiveSmallIntegerField()
show = models.ForeignKey(core.models.Show)
objects = PrefSheetManager()
def __str__(self):
return "%s / %s" % (self.user, self.show)
class Meta:
unique_together = (('user', 'show',), ('audition_number', 'show'),)
permissions = (('can_list', 'Can list prefsheets'),)
class Pref(models.Model):
prefsheet = models.ForeignKey(PrefSheet, related_name='prefs')
dance = models.ForeignKey(core.models.Dance, related_name='prefs')
pref = models.PositiveSmallIntegerField()
def __str__(self):
return "%s: %s" % (self.dance, self.pref)
class Meta:
ordering = ('prefsheet', 'pref')
unique_together = (('prefsheet', 'dance'), ('prefsheet', 'pref'),)
When using PrefFormSet, violating a unique_together constraint produces an IntegrityError, despite the validation step before. It appears that the inlineformset_factory helper removes the foreign key field from the produced forms, which prevents validate_unique from actually validating like it is supposed to.
A traceback from the error can be found here: http://dpaste.com/76055/
Change History (5)
comment:1 by , 17 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
comment:2 by , 15 years ago
| Resolution: | duplicate |
|---|---|
| Status: | closed → reopened |
I run into the same problem with SVN 13265. The unique_constraing of the child model is not checked by the form set returned by inlineformset_factory. Instead, the integrity error is raised. My code is equivalent to the code above except that I don't have custom form classes.
comment:3 by , 15 years ago
| Cc: | added |
|---|
comment:5 by , 15 years ago
| Resolution: | → invalid |
|---|---|
| Status: | reopened → closed |
Closing invalid. This report doesn't contain enough detail to reproduce the problem accurately -- it has foreign keys to models that don't exist, and a Manager object that isn't provided.
It doesn't describe the sequence of operations that are required to reproduce the problem, either -- it just talks about to 'validation", and refers to a "validation step before", but isn't clear about what validation step is the problem, or which one comes "before".
If anyone can provide a clear, reproducible test case, please reopen.
Duplicate of #8882.