Ваши метки в модели документа - это поле M2M, поэтому в конечном итоге будет отображаться мультиселектор в визуализированной форме (с отображением всех меток, доступных в системе).
Предполагается, что это то, что выхочу,
в views.py
def upload_document(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
labels = request.POST.getlist('labels')
new_document = form.save()
for label_id in labels: # we're only going to add currently defined labels
label = Label.objects.get(id=int(label_id))
new_document.labels.add(label)
new_document.save()
return HttpResponseRedirect("/thanks/")
else:
form = DocumentForm()
return render_to_response('doc_form.html', {'form':form}, context_instance=RequestContext(request))
Я обновил модель для Label в models.py ,
class Label(models.Model):
name = models.CharField(max_length=40, unique=True)
slug = models.SlugField(max_length=40, unique=True, editable=False)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Label, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
Если вы думали о том, чтобы пользователь также создавал ярлыки на лету, вам нужно переопределить поле меток в вашей форме чем-то другим, например, полем ввода.Например, если вы даете указание пользователям вводить метки, разделенные запятыми, то у вас будет обновленный вид views.py, например,
for label in labels: # labels entered by user
try:
lbl = Label.objects.get(name='label')
except Label.DoesNotExist:
lbl = None
if not lbl:
lbl = Label()
lbl.name = label
lbl.save()
newDoc.labels.add(lbl)
newDoc.save()
Надеюсь, что это решит вашу проблему или даст вам возможность поработатьс.