2011-01-12 4 views
5

Mam następujący model:Jak powiązać obraz z formularzem edycji w Django?

class Listing(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Title") 
    images = models.ManyToManyField('Image') 

, z ManyToManyField linkami do tego Image Klasa:

class Image(models.Model): 
    thumb = ImageField(upload_to='images/uploads/') 
    number = models.PositiveSmallIntegerField() 

i odpowiedni ModelForm tak:

class ListingEditForm(ModelForm): 
    image1 = ImageField(required=False, label="Photo 1") 
    image2 = ImageField(required=False, label="Photo 2") 
    image3 = ImageField(required=False, label="Photo 3") 

    class Meta: 
     model = Listing 
     exclude = ('images') 

Chodzi o to, aby nie ograniczaj liczby zdjęć, które mogą być powiązane z Listing ckend, ale w tej chwili potrzebuję tylko 3 obrazy w formularzu. Przesyłanie obrazów działa dobrze, ale jak byś postąpił wiążąc formularz z instancją Listing, aby obrazy nie były "Brakiem", gdy przegląda się formularz edycji?

Oczywiście, samo to nie będzie działać, ponieważ image1, image2 i image3 są tylko pola formularza, a nie częścią modelu:

form = forms.ListingEditForm(instance=listing) 

Więc dodanie słownika jako pierwszy parametr wydaje się oczywiste rzecz do zrobienia:

form = forms.ListingEditForm({'image1': ...},instance=listing) 

ale co należy wartość tego ... być? I jak mogę go pobrać z instancji Listing?

Odpowiedz

2

Odpowiem na moje własne pytanie, mimo że nie jest to odpowiedź, której szukałem. Rozejrzałem się i, o ile wiem, nie ma niezawodnego sposobu w HTML, aby zmienić zawartość pola wejściowego pliku. Tak więc, mógłbym się mylić, ale nawet jeśli wyślesz te informacje z prośbą, Django nie będzie w stanie pokazać informacji w polu (ponieważ nie odpowiada plikowi na lokalnym komputerze).

Więc moje rozwiązanie jest po prostu wysłać adresy URL obrazów z wnioskiem, jako jeden normalnie:

return render_to_response('edit.html', {'image1': image1_url, ...}) 

Następnie, jeśli informacja ta jest obecna, używam jQuery umieszczać obrazy obok pole wprowadzania pliku w szablonie i zaktualizuj je, jeśli użytkownik wybierze nowy plik. Nie jest najlepszy, ale działa.

Nadal będę zadowolony z usłyszenia innych rozwiązań.

0

Użyłbym relacji klucz obcy w obrazie i inlineformset_factory do generowania formularza.

ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)

Chciałbym również dodać pole Nazwa obrazu w modelu obrazu. W ten sposób użytkownik będzie miał wskazanie przesłanych plików na ekranie formularza, a także będzie mógł usunąć obrazy, jeśli będzie chciał. Jeśli potrzebujesz nielimitowanych uploadów, możesz po prostu zmienić max_num na 0 i dodatkowo na 1.

Oczywiście w ten sposób nie możesz powiązać jednego obrazu z więcej niż jednym obiektem Listingu, ale jeśli potrzebujesz użytkownika, możesz usunąć obrazy, które są i tak nie jest zalecane.