Модели Django избегают дубликатов - PullRequest
7 голосов
/ 16 июня 2010

В моделях:

class Getdata(models.Model):
    title = models.CharField(max_length=255)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)

    def __unicode__(self):
        return self.id()

В шаблонах:

<form>
    <input type="submit" value="save the data" />
</form> 

Если пользователь нажимает кнопку «Сохранить» и вышеуказанные данные сохраняются в таблице, как избежать дублирования, т.е. если пользователь снова нажимает на ту же кнопку отправки, не должно быть другой записи для тех же значений.Или это то, что нужно обрабатывать в представлениях?

Ответы [ 3 ]

28 голосов
/ 16 июня 2010

Если отдельное поле должно быть уникальным, тогда вы просто добавляете unique=True:

class Getdata(models.Model):
    title = models.CharField(max_length=255, unique=True)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)

Если вы хотите, чтобы комбинация полей была уникальной, вам нужно unique_together :

class Getdata(models.Model):
    title = models.CharField(max_length=255)
    state = models.CharField(max_length=2, choices=STATE, default="0")
    name = models.ForeignKey(School)
    created_by = models.ForeignKey(profile)
    class Meta:
        unique_together = ["title", "state", "name"]
2 голосов
/ 16 июня 2010

Рекомендованный unique_together также является наилучшим способом, но если он не соответствует вашим потребностям, вы можете обработать его чистым методом формы. например,

def clean(self):
   try:
      Getdata.objects.get(title=self.cleaned_data['title'], 
                          state=self.cleaned_data['state'],
                          name=self.cleaned_data['name'],
                          created_by=self.cleaned_data['created_by'] )
      #if we get this far, we have an exact match for this form's data
      raise forms.ValidationError("Exists already!")
   except Getdata.DoesNotExist:
      #because we didn't get a match
      pass

   return self.cleaned_data
1 голос
/ 16 июня 2016

Я думаю, что было бы неплохо внедрить код Jquery / JS, чтобы скрыть кнопку сохранения.

Создайте файл custom_validate.js, как показано ниже, и поместите его в каталог static (каталог статических файлов)

if (!$) {
    $ = django.jQuery;
}

$( document ).ready(function() {
    $("[name=_save]").click(function() {
       $("[name=_save]").css("visibility", "hidden");
    });
});

И в admin.py добавьте приведенный ниже код.

class CustomDataForm(forms.ModelForm):

    class Meta:
        model = GetData

class GetDataAdmin(admin.ModelAdmin):
    # ....
    .....
    form = CustomDataForm

    class Media:
        js = ('/static/custom_validate.js', )
...