Как разработать выпадающее меню в Django на основе поля внешнего ключа в модели - PullRequest
0 голосов
/ 29 апреля 2019

Я разрабатываю форму Django для загрузки файлов.Форма основана на модели (файлы).Модель (файлы) имеет поле внешнего ключа (repo_id).Этот repo_id является первичным ключом в модели репозитория.

Я хочу, чтобы пользователи могли выбирать, в какой repo_id помещать файл. Мне нужно вставить значение в это поле, используя раскрывающийся список вform.

в шаблоне HTML раскрывающийся список отображается как «Repository object (repo_id)» screen shot of the drop down list

Я разработал две модели (файлы ирепозиторий) в файлах models.py, views.py, forms.py и HTML-шаблоне после обучения.Форма работает и сохраняет данные в таблице базы данных.

Я хочу обновить раскрывающееся меню только для отображения имен индикаторов в модели хранилища, а не объекта хранилища.

Вот мои коды.

models.py

from django.db import models

# Create your models here.
class Repository(models.Model):
    source = models.TextField(db_column='source', blank=True, null=True)  # Field name made lowercase.
    indicator = models.TextField(db_column='indicator', blank=True, null=True)  # Field name made lowercase.
    key_aspect = models.TextField(db_column='key_aspect', blank=True, null=True) 
    category = models.TextField(db_column = 'category')
    table_id = models.TextField(db_column='table_id', blank=True, null=True)
    data_returning = models.TextField(db_column='data_returning', blank=True, null=True)
    data_source = models.TextField(db_column='data_source', blank=True, null=True)
    value = models.TextField(db_column='value', blank=True, null=True)  # Field name made lowercase.
    year = models.TextField(db_column='year', blank=True, null=True)  # Field name made lowercase.
    location = models.TextField(db_column='location', blank=True, null=True)  # Field name made lowercase.



class files(models.Model):
    repo_id = models.ForeignKey(Repository, on_delete = models.CASCADE)
    username = models.CharField(db_column='username',max_length = 45)
    date = models.DateTimeField(auto_now_add=True, db_column = 'date')
    file = models.FileField(upload_to='documents/', db_column = 'file')
    username = models.CharField(db_column='username',max_length = 45)


    def __unicode__(self):
        return self.indicator_name

forms.py
class DocumentForm(forms.ModelForm):
class Meta:
    model = files
    fields = ('username',  'file', 'repo_id')



views.py
@login_required
def file_upload(request):
     websiterepository = Repository
     #indicator_queryset = websiterepository.objects.filter(category = 'P').values_list('id','indicator')

    if request.method == 'POST':
         documentform = DocumentForm(request.POST, request.FILES)

         if documentform.is_valid():
             documentform.save()
         return redirect('file_upload')
    else:
         form = DocumentForm()
         #documentform = DocumentForm(prefix = 'documentform')
         #searchform = SearchForm(indicator_queryset = indicator_queryset, prefix = 'searchform')
         #form = {'documentform':documentform, 'searchform':searchform}
         #return render(request, 'form_file_upload.html', form )
         return render(request, 'form_file_upload.html', {'form':form })

Я знаю, что это просто пост.Я был бы очень признателен, если бы вы помогли мне разобраться в этом. Спасибо

1 Ответ

0 голосов
/ 29 апреля 2019

Измените модели на приведенный ниже код

class Repository(models.Model):
    source = models.TextField(db_column='source', blank=True, null=True)  # Field name made lowercase.
    indicator = models.TextField(db_column='indicator', blank=True, null=True)  # Field name made lowercase.
    key_aspect = models.TextField(db_column='key_aspect', blank=True, null=True) 
    category = models.TextField(db_column = 'category')
    table_id = models.TextField(db_column='table_id', blank=True, null=True)
    data_returning = models.TextField(db_column='data_returning', blank=True, null=True)
    data_source = models.TextField(db_column='data_source', blank=True, null=True)
    value = models.TextField(db_column='value', blank=True, null=True)  # Field name made lowercase.
    year = models.TextField(db_column='year', blank=True, null=True)  # Field name made lowercase.
    location = models.TextField(db_column='location', blank=True, null=True)  # Field name made lowercase.

    def __str__(self):
       return self.indicator

Если вы хотите, чтобы модель возвращала значение поля, вы должны определить собственную функцию, иначе она вернет соответствующий объект.

...