1
class Advert(models.Model):
    location_relation = models.ForeignKey("administrative_division.Towns", to_field='name_unique')


class Towns(models.Model):
    name = models.CharField(max_length=128)
    slug = models.SlugField()

    voivodship = models.ForeignKey("Voivodships", to_field='voivodship_identifier')
    county = models.ForeignKey("Counties")

    name_unique=models.CharField(max_length=255, unique=True)
    town_unique=models.BooleanField()

    def __unicode__(self):
        return "%s. %s"% (self.id, self.name) 



class AdvertForm(ModelForm):

    category = CustomTreeNodeChoiceField(queryset=Category.objects.filter(parent__isnull=False), empty_label="Wybierz kategorię", label="Kategoria")

    class Meta:
        model = Advert
        exclude = ('ip', 'user')
        widgets = {
            'location_relation': TextInput
        }

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(AdvertForm, self).__init__(*args, **kwargs)

    def clean_location_relation(self):
        from string import capitalize
        from django import forms
        from administrative_division.models import Towns

        cleaned_data = self.cleaned_data['location_relation']
        try:
            cleaned_data = Towns.objects.get(name_unique=capitalize(cleaned_data.name_unique))
        except:
            raise forms.ValidationError("Such city does not exist")

        return cleaned_data

選択フィールドの代わりにテキスト入力フォームフィールドを使用します。したがって、一意の名前を手動で指定する必要があります。

私が必要としているのは、location_relationという名前のフィールドに提供された文字列を大文字にすることです。モデルでcleanメソッドを使用するなど、さまざまなオプションを試しましたが、モデル形式でcleanを試しました。

現時点ではどうすればいいのかよくわかりません。

この問題のヒントまたは解決策を教えてください:)

4

1 に答える 1

0

私はちょうどこのようなことをしました; 非整数入力 (FK -ModelChoiceField に必要) で動作するように、そのメソッドとメソッドをサブクラス化ModelChoiceFieldして変更する必要があります。prepare_valueclean

私の場合、それは、まだ存在しない場合に新しいエントリを作成する先行入力外部キー テキスト フィールドでした (たとえば、タグに役立ちます)。

class MyModelChoiceField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        self.widget = kwargs.pop('widget', forms.TextInput)
        super(MyModelChoiceField, self).__init__(*args, **kwargs)

    def prepare_value(self, value):
        # return value from original value, a PK.
        value = super(MyModelChoiceField, self).prepare_value(value)
        if not value:
            return value

        try:
            return self.queryset.model.objects.get(id=value).name
        except self.queryset.model.DoesNotExist:
            return ''

    def clean(self, value):
        # return instance from text input string
        if not value and not self.required:
            return None
        elif not value:
            raise forms.ValidationError("%s is required" % (self.queryset.model._meta.verbose_name,))
        try:
            return self.queryset.model.objects.filter(my_field=value).get()
        except self.queryset.model.DoesNotExist:
            raise forms.ValidationError("%s is not a valid option" % (self.queryset.model._meta.verbose_name,))


class MyForm(forms.ModelForm):
    # ...
    my_field = MyModelChoiceField(queryset=Foo, etc.)

カスタム ウィジェットと組み合わせると、数行のコードで任意の FK フィールドにこれを使用でき、自動で先行入力 JS を含めることができます。ジャンゴ大好き!

于 2012-08-19T16:19:14.660 に答える