Приложение Django zum loggen

#django #view #model

#django #Вид #Модель

Вопрос:

Допустим, у меня есть две модели:

 class Thinclient(models.Model):
    hostname = models.TextField(_('hostname'),unique=True, 
        editable=False)
    logs = models.ManyToManyField(Log, blank=True, null=True)

class Log(models.Model):
    logname = models.TextField(editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False)
  

Как вы можете видеть, у меня есть тонкие клиенты. Теперь, если один из этих тонких клиентов загружается, он должен отправить POST-запрос в мое приложение с именем тонкого клиента и логином (т. Е. «Загрузка …»).

Теперь мой view выполнит всю работу, и в этом у меня проблема. В настоящее время это выглядит так:

 def log(request):
    if request.method == 'POST':
        form = ThinclientForm(request.POST)
        if form.is_valid():
            message = form.cleaned_data['logname']
            Log.objects.get_or_create(logname=message)
            return HttpResponse(content="", mimetype=None, status=200)
        else:
            return HttpResponse(content="Unsuccessful", mimetype=None,
                status=400)

        return render_to_response('thin/status', {
            'form': form, })
  

Однако это не сработает, потому что я должен назначить сообщение одному конкретному тонкому клиенту. Я полагаю, мне нужно написать свою собственную форму с именем хоста, logname, и именно здесь у меня возникла проблема, как я могу сохранить свои модели таким образом, чтобы сообщение было присвоено тонкому?

Надеюсь, я мог бы объяснить, что мне нужно знать, если не сказать мне. И спасибо за любую помощь в этом

Комментарии:

1. Название вашего вопроса на немецком языке.

Ответ №1:

Предполагая, что ваше имя Thinclient также включено в сообщение, вы можете просто получить его оттуда и использовать для поиска фактического объекта, а затем назначить ему это сообщение журнала.

 log = Log.objects.get_or_create(logname=message)
client = Thinclient.objects.get(hostname=request.POST['clientname']
client.logs.add(log)
  

(Одно замечание: вы не должны использовать текстовые поля для таких вещей, как имена клиентов — они хранятся в базе данных в виде объектов BLOB / TEXT, что гораздо менее эффективно, чем обычные переменные. Вместо этого используйте CharField.)

Ответ №2:

Здесь есть несколько проблем. Первый заключается в разработке ваших моделей. Ссылка от Log до ThinClient должна быть ForeignKey от Log до ThinClient

 class Thinclient(models.Model):
    hostname = models.TextField(_('hostname'),unique=True, 
        editable=False)

class Log(models.Model):
    thin_client = models.ForeignKey(Thinclient)
    logname = models.TextField(editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False)
  

Вам вообще нужна форма здесь? Разве ваши тонкие клиенты не просто отправляют сообщение по этому URL-адресу? Они действительно делают GET, чтобы получить форму? Преимущество форм заключается в возможности преобразования их в HTML и проверки данных. Я не думаю, что вам нужно что-то из этого здесь.

Имя хоста удаленного клиента хранится в заголовке REMOTE_HOST запроса, поэтому вы можете использовать это, чтобы извлечь его.

 def log(request):
    thin_client, _ = Thinclient.get_or_create(hostname=request.META["REMOTE_HOST"])

    Log(thin_client=thin_client, logname=request.POST["logname"]).save() 

    return HttpResponse(content="OK", mimetype="text/plain")
  

В качестве примечания вы всегда должны возвращать некоторый контент. Некоторым прокси не нравятся ответы с нулевым байтом. Вы также должны всегда указывать mimetype , даже если по умолчанию используется text / html .