Django: Почему мой «save_model ()» не работает? - PullRequest
2 голосов
/ 22 декабря 2010

Я буду очень, ОЧЕНЬ благодарен , если кто-нибудь поможет мне разобраться с моей проблемой кодирования. Когда я нахожусь в интерфейсе администратора, ошибки не генерируются. Однако ничто из того, что я указываю в своей пользовательской функции save_model (...), кажется, не выполняется, когда я нажимаю «Сохранить» для объекта Provider в интерфейсе администратора. Я сконцентрировал свой код в маленьких снимках. Что я делаю не так?

Примечание: это может показаться странным, но я также пытаюсь удалить объект во время процесса сохранения (перед этим он должен перезаписать другой объект «провайдера»).

===================

model.py

#models.py
...
class Provider(models.Model):  
  title = models.CharField(max_length=150)
  purpose = models.TextField()
  summary = models.TextField()
  email = models.EmailField()
  access_code = models.CharField(max_length=30, default=random_password)
  verified = models.BooleanField(default=False) #On/Off switch to display on database
  flagged = models.BooleanField(default=False) 
  revised = models.BooleanField(verbose_name = "New Update", default=False)
    # Will be True, if a revision has occured
        # On/Off switch state whether this is a revision of an existing Provider
    # This will be useful for creating a manager that lists updated providers
    # Note: Must delete Revised_Provider object after verification is complete
    # and UPDATE has occurred on save()

  #M2M Relations
  serviced_location = models.ManyToManyField(Location, through='ServicedLocations')
  services_offered = models.ManyToManyField(ServiceType, through='OfferedServices')
  insurances_accepted = models.ManyToManyField(InsuranceProvider, through='AcceptedInsurances')
  #contacts = models.ManyToManyField(Contact, blank=True)

  def __unicode__(self):
    return self.title

#Used for allow the provider to make change to their profile, and wait
#for verification before it will show up on regular search results
#Serves as a map for referencing a verified provider to a recent update (revision)
class Revision(models.Model): #Revised Providers (eg: Updated)
  provider = models.ForeignKey(Provider, null=True)
  date_revised = models.DateTimeField(auto_now=True, auto_now_add=True)
  def __unicode__(self):
      return u'%s' % self.provider

class ServicedLocations(models.Model):
  location = models.ForeignKey(Location)
  provider = models.ForeignKey(Provider) #Pre-Verified or Verified Settings
  revision = models.ForeignKey(Revision, null=True, on_delete=models.SET_NULL)
...etc...

===================

admin.py

#admin.py
from django.contrib import admin
from django.forms.models import ModelForm
from django import forms
from health.providers.models import *
class ProviderAdminForm(forms.ModelForm):
    def clean(self):
        cleaned_data = self.cleaned_data
        flagged = cleaned_data.get("flagged")
        verified = cleaned_data.get("verified")

        if flagged == True and verified == True:
        raise forms.ValidationError("You cannot verify a 'flagged' provider. If you meant to verify this provider, be sure to uncheck 'flagged'")
               # Just in case someone accidently verified a flagged provider       
        return cleaned_data

class ProviderAdmin(admin.ModelAdmin):    
    list_per_page = 100
    list_display = ('date_added', 'title', 'state', 'verified', 'flagged')
    list_display_links = ('title',)
    list_filter = ('verified', 'flagged', 'revised')
    search_fields = ['title',]
    filter_horizontal = ('services_offered',)
    form = ProviderAdminForm

    def save_model(self, request, obj, form, change):
        ProviderID = obj.id
        try: #see if a revision exists in the table
            Compare = Revision.objects.get(id=ProviderID)

            OldProviderID = Compare.provider.id
            OldProvider = Provider.objects.get(id=OldProviderID)

            RevisedProvider = Provider.objects.get(id=ProviderID) 
            RevisedProviderID = RevisedProvider.id

            if change:  #Check to see if we changed anything important
                verified = form.cleaned_data['verified']
                #Means we would have had to manually verified it

                if verified == True: 
                #This means that we have approved to update the old Provider
                #After copying the data over, we destroy what we are saving

                    obj.revised = False
                    obj.save()
                    #If we verfied it, revised = False  

                    OldProvider = RevisedProvider #Update Existing Provider Table
                    OldProvider.save()


                    NewLocations = ServicedLocations.objects.get(provider=RevisedProviderID)
                    OldLocations = ServicedLocations.objects.get(provider=OldProviderID)
                    OldLocations = NewLocations
                    OldLocations.save()
                    NewLocations.delete()


                    Compare.delete() #Delete from database
                    RevisedProvider.delete() #Delete Final Copy of Table

                    return HttpResponseRedirect("admin/providers/provider/%s/" % OldProviderID) #Redirect them to updated provider

        except Revision.DoesNotExist:
         print "This provider does not have any unverified revisions"

        return super(ProviderAdmin, self).save_model(request, obj, form, change)       

admin.site.register(Provider, ProviderAdmin)

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Юджи,

Спасибо за ваши советы, и я ценю вашу усердную работу по изучению моего неорганизованного кодирования.

Первоначально моей целью было создание списка провайдеров, которые должны были быть проверены (в интерфейсе администратора), прежде чем появляться в общедоступных результатах поиска.Проблема, с которой я столкнулся, заключалась в том, что, если провайдер обновлял свою контактную информацию, мы автоматически устанавливаем значение valid = False (в случае публикации чего-либо неподобающего).Таким образом, провайдер, который обновил свою информацию, должен был бы затем быть повторно проверен, прежде чем вообще появиться в базе данных.Это было ужасно, потому что они будут немедленно удалены из результатов поиска.Вот почему я внес изменения в свою базу данных, чтобы поставщик мог редактировать и обновлять свою информацию в любое время.Теперь новые изменения просто не появятся, пока мы не проверим вручную обновленную версию информации провайдера.

Я хотел сохранить идентификатор контакта таким же, чтобы история ведения журнала оставалась.тот же самый.Это стало слишком сложным.Таким образом, в итоге мы сделали так, чтобы при сохранении () она удаляла старую версию, если проверено было проверено как True.

0 голосов
/ 22 декабря 2010

Где код выкачивает? Вы говорите, что он не будет исполнять вообще ? даже не записывать операторы на первой строке? или вы говорите, что ожидаемые изменения не вносятся в БД?

Я пытался воссоздать вашу ситуацию с помощью различных теорий, но не могу воспроизвести проблему. Не могли бы вы подробнее описать, в чем проблема? Попробуйте сделать pdb.set_trace (), покопайтесь и расскажите нам немного подробнее:)

Поскольку вы не предоставили исключение, вам нужно предоставить больше информации о том, что не так.

PS: я читаю твой код, но его очень сложно прочитать! Классы выглядят как экземпляры, которые выглядят как переменные ... На первый взгляд, это идет вразрез с соглашениями о кодировании для Python, как вы можете увидеть с помощью подсветки синтаксиса, считая, что ваши CapitalizedObjects являются классами.


Похоже, вы сохраняете основной объект, меняете его ссылочное имя несколько раз, затем сохраняете его снова, а затем удаляете! Здесь происходят очень запутанные вещи ...

Вот что я вижу ...

RevisedProvider - это тот же экземпляр, что и obj.
RevisedProvider = Provider.objects.get(id=obj.id)

Затем вы назначаете RevisedProvider для OldProvider и вызываете save() для этого, который является тем же экземпляром, что и obj (2 сохранения).

В конце вы удаляете RevisedProvider.delete(), который является объектом, который вы редактируете.

Когда я пытаюсь воспроизвести этот код и удалить экземпляр, который я редактирую, django выдает ошибку ValidationError.

Ооо, нам нужна дополнительная информация, чтобы помочь. Где другие странности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...